home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / ct_xmp15 / mxmplay.asm < prev    next >
Assembly Source File  |  1996-09-15  |  55KB  |  3,226 lines

  1. ;// MXM player, (c) '95/96 Niklas Beisert / pascal
  2. .386
  3. locals
  4.  
  5. GETSETINTMODE=7 ;// 1:dpmi, 2:dos, 4:eos
  6. DPMIPSPCODE=1
  7. DOS32CODE=1
  8.  
  9. ;//this is the right place to include the effects include file!
  10. include mxmallfx.inc
  11.  
  12. ifdef USEEOSINC
  13.   include eos.inc
  14. endif
  15.  
  16. ;// *************************************************************************
  17. ;// no need to touch anything beyond this point...
  18.  
  19. MXMPLAY_TEXT segment dword public use32 'CODE'
  20. assume cs:MXMPLAY_TEXT
  21.  
  22. copyright db "cubic tiny gus xm player v1.5 (c) '95/96 Niklas Beisert / pascal"
  23.  
  24. include mxmplay.inc
  25.  
  26. USEVOLCOL=(USEVVOL or USEVVOLSLIDE or USEVFVOLSLIDE or USEVVIBRATE or USEVVIBRATO or USEVPAN or USEVPANSLIDE or USEVPORTANOTE)
  27. USEAMIGAFREQ=((USEFREQTAB eq 1) eq 0)
  28. USELINEARFREQ=((USEFREQTAB eq 0) eq 0)
  29. USEBOTHFREQ=(USEAMIGAFREQ and USELINEARFREQ)
  30. GETSETINTMODEMULTI=(GETSETINTMODE ne 1) and (GETSETINTMODE ne 2) and (GETSETINTMODE ne 4)
  31.  
  32. ifndef Ver_EOS
  33.   Int_EOS equ int 61h
  34.   Get_Irq=4ah
  35.   Set_Irq=4bh
  36. endif
  37.  
  38. mxmheader struc
  39.   hdMXMSig dd ?
  40.   hdNOrders dd ?
  41.   hdOrdLoopStart dd ?
  42.   hdNChannels dd ?
  43.   hdNPatterns dd ?
  44.   hdNInstruments dd ?
  45.   hdIniTempo db ?
  46.   hdIniBPM db ?
  47.   hdOptions dw ?
  48.   hdSampStart dd ?
  49.   hdSampMem8 dd ?
  50.   hdSampMem16 dd ?
  51.   hdPitchMin dd ?
  52.   hdPitchMax dd ?
  53.   hdPanPos db 32 dup (?)
  54.   hdOrderTable db 256 dup (?)
  55.   hdInstrTable dd 128 dup (?)
  56.   hdPatternTable dd 256 dup (?)
  57. ends
  58.  
  59. instrument struc
  60.   insNSamples dd ?
  61.   insSamples db 96 dup (?)
  62.   insVolFade dw ?
  63.   insVibType db ?
  64.   insVibSweep db ?
  65.   insVibDepth db ?
  66.   insVibRate db ?
  67.   insVNum db ?
  68.   insVSustain db ?
  69.   insVLoopS db ?
  70.   insVLoopE db ?
  71.   insVEnv dw 24 dup (?)
  72.   insPNum db ?
  73.   insPSustain db ?
  74.   insPLoopS db ?
  75.   insPLoopE db ?
  76.   insPEnv dw 24 dup (?)
  77.   db 46 dup (?)
  78. ends
  79.  
  80. sample struc
  81.   smpGUSStartPos db ?,?,?
  82.   smpGUSLoopPos db ?,?,?
  83.   smpGUSEndPos db ?,?,?
  84.   smpGUSMode db ?
  85.   smpDefVol db ?
  86.   smpDefPan db ?
  87.   smpNormNote dw ?
  88.   db ?,?
  89. ends
  90.  
  91.  
  92.  
  93.  
  94. channelsize = 256
  95. channel struc
  96.   chGUSInited db ?
  97.   chGUSStartPos dd ?
  98.   chGUSEndPos dd ?
  99.   chGUSLoopPos dd ?
  100.   chGUSMode db ?
  101.   chGUSStopIt db ?
  102.   chGUSChangeSamp db ?
  103.   chGUSNextPos dd ?
  104.   chGUSFrq dw ?
  105.   chGUSVol dw ?
  106.   chGUSPan db ?
  107.  
  108.   chVol db ?
  109.   chFinalVol db ?
  110.   chPan db ?
  111.   chFinalPan db ?
  112.   chPitch dd ?
  113.   chFinalPitch dd ?
  114.  
  115.   chCurIns db ?
  116.   chEnvIns dd ?
  117.   chCurNormNote dw ?
  118.   chSustain db ?
  119.   chFadeVol dw ?
  120.   chAVibPos db ?
  121.   chAVibSwpPos db ?
  122.   chVolEnvPos dd ?
  123.   chVolEnvSegPos dw ?
  124.   chPanEnvPos dd ?
  125.   chPanEnvSegPos dw ?
  126.  
  127.   chDefVol db ?
  128.   chDefPan db ?
  129.   chCommand db ?
  130.   chVCommand db ?
  131.   chPortaToPitch dd ?
  132.   chPortaToVal dd ?
  133.   chVolSlideVal db ?
  134.   chGVolSlideVal db ?
  135.   chVVolPanSlideVal db ?
  136.   chPanSlideVal db ?
  137.   chFineVolSlideUVal db ?
  138.   chFineVolSlideDVal db ?
  139.   chPortaUVal dd ?
  140.   chPortaDVal dd ?
  141.   chFinePortaUVal db ?
  142.   chFinePortaDVal db ?
  143.   chXFinePortaUVal db ?
  144.   chXFinePortaDVal db ?
  145.   chVibRate db ?
  146.   chVibPos db ?
  147.   chVibType db ?
  148.   chVibDep db ?
  149.   chTremRate db ?
  150.   chTremPos db ?
  151.   chTremType db ?
  152.   chTremDep db ?
  153.   chPatLoopCount db ?
  154.   chPatLoopStart db ?
  155.   chArpPos db ?
  156.   chArpNotes db ?,?,?
  157.   chActionTick db ?
  158.   chMRetrigPos db ?
  159.   chMRetrigLen db ?
  160.   chMRetrigAct db ?
  161.   chDelayNote db ?
  162.   chOffset db ?
  163.   chGlissando db ?
  164.   chTremorPos db ?
  165.   chTremorLen db ?
  166.   chTremorOff db ?
  167. ends
  168.  
  169. globaldatastruct struc
  170.   globalvol db ?
  171.   uservol db ?
  172.   syncval db ?
  173.  
  174.   curtick db ?
  175.   curtempo db ?
  176.   tick0 db ?
  177.  
  178.   currow dd ?
  179.   patptr dd ?
  180.   patlen dd ?
  181.  
  182.   curord dd ?
  183.  
  184.   jumptoord dd ?
  185.   jumptorow dd ?
  186.   patdelay db ?
  187.  
  188.   procnot db ?
  189.   procins db ?
  190.   procvol db ?
  191.   proccmd db ?
  192.   procdat db ?
  193.   notedelayed db ?
  194.  
  195.   tmGetSetIntMode db ?
  196.   tmOldTimer df ?
  197.   tmOldSSESP df ?
  198.   tmIntCount dd ?
  199.   tmTimerRate dd ?
  200.   tmTicker dd ?
  201.   tmInRoutine dd ?
  202.   stimerlen dd ?
  203.   stimerpos dd ?
  204.   datasegsel dw ?
  205.   maxtimerrate dd ?
  206.  
  207.   gusport dd ?
  208.   guschannels dd ?
  209.  
  210.   portatmp db ?
  211.  
  212.   head mxmheader ?
  213.  
  214.   guslinvol dw 257 dup (?)
  215.  
  216.   chandata db channelsize*32 dup (?)
  217.  
  218.   tmStack db 1024 dup (?)
  219.  
  220.   vibtabs db 1024 dup (?)
  221. ends
  222.  
  223. ;//.data?
  224. ;//globdat globaldatastruct ?
  225. ;//.code
  226.  
  227. globdatptr dd 0
  228.  
  229. ;//*************************************************************************
  230. ;// XM player
  231.  
  232. loadebp proc
  233. ;//  lea ebp,globdat  ;// would cause a relocation
  234.   call @@getadr
  235. @@getadr:
  236.   pop ebp
  237.   mov ebp,cs:[ebp+globdatptr-@@getadr]
  238.   ret
  239. endp
  240.  
  241. inittables proc
  242. if USEVIBRATO or USEVVIBRATO or USEAUTOVIBRATO
  243.   call @@getadr
  244. @@getadr:
  245.   pop esi
  246.   add esi,sintab-@@getadr
  247.   lea edi,[ebp].vibtabs
  248.   mov ecx,16
  249.   rep movsd
  250.   mov al,64
  251.   stosb
  252.   mov cl,63
  253. @@sintabloop1:
  254.     dec esi
  255.     mov al,[esi]
  256.     stosb
  257.   dec cl
  258.   jnz @@sintabloop1
  259.   lea esi,[ebp].vibtabs
  260.   mov cl,128
  261. @@sintabloop2:
  262.     lodsb
  263.     neg al
  264.     stosb
  265.   dec cl
  266.   jnz @@sintabloop2
  267.  
  268. if USEVIBTYPE or USETREMTYPE or USEAUTOVIBRATOTYPE
  269. @@dwntabloop:
  270.     mov al,cl
  271.     sar al,1
  272.     neg al
  273.     stosb
  274.   dec cl
  275.   jnz @@dwntabloop
  276.  
  277. @@rectabloop:
  278.     mov al,cl
  279.     and al,80h
  280.     sub al,40h
  281.     stosb
  282.   dec cl
  283.   jnz @@rectabloop
  284.  
  285. @@uptabloop:
  286.     mov al,cl
  287.     sar al,1
  288.     stosb
  289.   dec cl
  290.   jnz @@uptabloop
  291. endif
  292. endif
  293.  
  294.   mov [ebp].guslinvol[0],0
  295.   mov [ebp].guslinvol[512],0EFFFh
  296.  
  297.   mov edi,1
  298. @@lintabloop:
  299.     mov ebx,edi
  300.     mov edx,7
  301.   @@logloop:
  302.     cmp ebx,0
  303.     je @@logfound
  304.       shr ebx,1
  305.       inc edx
  306.     jmp @@logloop
  307.   @@logfound:
  308.     mov eax,edi
  309.     mov cl,20
  310.     sub cl,dl
  311.     shl eax,cl
  312.     and eax,0fffh
  313.     shl edx,12
  314.     or eax,edx
  315.     sub eax,1000h
  316.     mov [ebp].guslinvol[2*edi],ax
  317.   inc edi
  318.   cmp edi,256
  319.   jne @@lintabloop
  320.  
  321.   ret
  322. endp
  323.  
  324.  
  325. public xmpInit_
  326. xmpInit_ proc ;// esi:mxmdata, ecx:maxtimerrate, eax:gusport, ebx:globdat, edx:getsetintmode
  327.   push ebp
  328.  
  329. ;//  lea ebx,globdat
  330.   call @@getadr
  331. @@getadr:
  332.   pop ebp
  333.   mov [ebp+globdatptr-@@getadr],ebx
  334.   mov ebp,ebx
  335.   mov ebx,4000h
  336. @@inilp:
  337.     dec ebx
  338.     mov byte ptr [ebp+ebx],0
  339.   jnz @@inilp
  340.  
  341. if GETSETINTMODEMULTI
  342.   mov [ebp].tmGetSetIntMode,dl
  343. endif
  344.   mov [ebp].maxtimerrate,ecx
  345.   mov [ebp].uservol,40h
  346.  
  347.   mov [ebp].gusport,eax
  348.  
  349.   cmp [esi].hdMXMSig,004D584Dh
  350.   jne @@fail
  351.  
  352.   lea edi,[ebp].head.hdMXMSig
  353.   mov ecx,750h/4
  354.   rep movsd
  355.  
  356.   sub esi,750h
  357.   sub edi,600h
  358.   mov ecx,180h
  359. @@relloop:
  360.     add [edi],esi
  361.     add edi,4
  362.   dec ecx
  363.   jnz @@relloop
  364.  
  365. if USEDELTASAMP
  366.   test byte ptr [esi].hdOptions,4
  367.   jz @@nodelta
  368.     and byte ptr [esi].hdOptions,not 4
  369.  
  370.     mov ecx,[esi].hdSampMem8
  371.     mov ebx,[esi].hdSampStart
  372.     add ebx,esi
  373.     xor eax,eax
  374.     cmp ecx,0
  375.     je @@8bitfini
  376.   @@8bitdelta:
  377.       add al,[ebx]
  378.       mov [ebx],al
  379.       inc ebx
  380.     dec ecx
  381.     jnz @@8bitdelta
  382.   @@8bitfini:
  383. if USE16BIT
  384.     mov ecx,[esi].hdSampMem16
  385.     xor eax,eax
  386.     cmp ecx,0
  387.     je @@16bitfini
  388.   @@16bitdelta:
  389.       add ax,[ebx]
  390.       mov [ebx],ax
  391.       add ebx,2
  392.     dec ecx
  393.     jnz @@16bitdelta
  394.   @@16bitfini:
  395. endif
  396. @@nodelta:
  397. endif
  398.  
  399.   mov ecx,[esi].hdSampMem16
  400.   shl ecx,1
  401.   add ecx,[esi].hdSampMem8
  402.   mov eax,[esi].hdSampStart
  403.   add esi,eax
  404.  
  405.   call gusUploadSamples
  406.   call inittables
  407.  
  408.   mov eax,1
  409.   jmp @@done
  410.  
  411. @@fail:
  412.   xor eax,eax
  413. @@done:
  414.  
  415.   pop ebp
  416.   ret
  417. endp
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424. getfreq6848 proc
  425.   push edx
  426.   push ebx
  427.   push ecx
  428.   push esi
  429.   add eax,8000h
  430.   mov edx,eax
  431.   mov ebx,eax
  432.   mov ecx,eax
  433.   shr eax,12
  434.   shr edx,8
  435.   shr ebx,4
  436.   and eax,15
  437.   and ebx,15
  438.   and ecx,15
  439.   and edx,15
  440.   call @@getadr
  441. @@getadr:
  442.   pop esi
  443.   add esi,logfreqtab-@@getadr
  444.   mov eax,[esi+6*16+eax*4]
  445.   movzx edx,word ptr [esi+4*16+edx*2]
  446.   movzx ebx,word ptr [esi+2*16+ebx*2]
  447.   movzx ecx,word ptr [esi+0*16+ecx*2]
  448.   mul edx
  449.   shrd eax,edx,15
  450.   mul ebx
  451.   shrd eax,edx,15
  452.   mul ecx
  453.   shrd eax,edx,15
  454.   pop esi
  455.   pop ecx
  456.   pop ebx
  457.   pop edx
  458.   ret
  459. endp
  460.  
  461.  
  462.  
  463.  
  464. PlayNote proc
  465.   mov [ebp].portatmp,0
  466.  
  467.   cmp [ebp].proccmd,3
  468.   jne @@noportac
  469.     mov [ebp].portatmp,1
  470. @@noportac:
  471.   cmp [ebp].proccmd,5
  472.   jne @@noportacv
  473.     mov [ebp].portatmp,1
  474. @@noportacv:
  475.   cmp [ebp].procvol,0f0h
  476.   jb @@noportav
  477.     mov [ebp].portatmp,1
  478. @@noportav:
  479.  
  480.   cmp [ebp].procnot,97
  481.   jne @@nokeyoff
  482.     mov [edi].chSustain,0
  483.     mov [ebp].procnot,0
  484. @@nokeyoff:
  485.  
  486.   movzx eax,[ebp].procins
  487.   cmp al,0
  488.   je @@noins1
  489.   cmp eax,[ebp].head.hdNInstruments
  490.   ja @@noins1
  491.     mov [edi].chCurIns,al
  492. @@noins1:
  493.   cmp [edi].chCurIns,0
  494.   je @@done
  495.  
  496.   movzx eax,[ebp].procnot
  497.   cmp al,0
  498.   je @@nonote
  499.     cmp [ebp].procins,0
  500.     je @@nohit
  501.       mov [edi].chSustain,1
  502.   @@nohit:
  503.  
  504.     mov [edi].chDelayNote,al
  505.     cmp [ebp].proccmd,49
  506.     jne @@nodelay
  507.       cmp [ebp].procdat,0
  508.       jne @@done
  509.   @@nodelay:
  510.  
  511.     dec al
  512.     cmp [ebp].portatmp,1
  513.     je @@portanote
  514.       mov [edi].chGUSStopIt,1
  515.  
  516.       movzx edx,[edi].chCurIns
  517.       dec dl
  518.       mov edx,[ebp].head.hdInstrTable[4*edx]
  519.       movzx ebx,insSamples[edx][eax]
  520.       cmp ebx,insNSamples[edx]
  521.       jae @@done
  522.       shl ebx,4
  523.       lea ebx,[ebx+edx+256]
  524.  
  525.       mov [edi].chGUSInited,1
  526.       mov [edi].chGUSChangeSamp,1
  527.  
  528.       push eax
  529.       mov eax,dword ptr [ebx].smpGUSStartPos
  530.       and eax,0ffffffh
  531.       mov [edi].chGUSStartPos,eax
  532.       mov eax,dword ptr [ebx].smpGUSLoopPos
  533.       and eax,0ffffffh
  534.       mov [edi].chGUSLoopPos,eax
  535.       mov eax,dword ptr [ebx].smpGUSEndPos
  536.       and eax,0ffffffh
  537.       mov [edi].chGUSEndPos,eax
  538.       mov al,[ebx].smpGUSMode
  539.       mov [edi].chGUSMode,al
  540.       pop eax
  541.  
  542.       cmp [ebp].procins,0
  543.       je @@noins2
  544.         mov [edi].chEnvIns,edx
  545.         mov dl,[ebx].smpDefVol
  546.         mov [edi].chDefVol,dl
  547.         mov dl,[ebx].smpDefPan
  548.         mov [edi].chDefPan,dl
  549.     @@noins2:
  550.  
  551.       mov dx,[ebx].smpNormNote
  552.       mov [edi].chCurNormNote,dx
  553.  
  554. ;// process finetune here (proccmd==41)
  555. ;// overwrite top 4 bits of instrument finetune value
  556. ;// cannot do this correctly, since conversion reduced information... :(
  557. ;// this command sucks anyway!!!
  558.  
  559.       shl eax,8
  560.       add ax,dx
  561.       neg ax
  562.       add ah,48
  563.       movsx eax,ax
  564. if USEBOTHFREQ
  565.       test byte ptr [ebp].head.hdOptions,1
  566.       jnz @@noamiga1
  567. endif
  568. if USEAMIGAFREQ
  569.         neg eax
  570.         call getfreq6848
  571.     @@noamiga1:
  572. endif
  573.       mov [edi].chPitch,eax
  574.       mov [edi].chFinalPitch,eax
  575.       mov [edi].chPortaToPitch,eax
  576.  
  577.       xor eax,eax
  578. if USEOFFSET
  579.       cmp [ebp].proccmd,9
  580.       jne @@nooffset
  581.         mov al,[ebp].procdat
  582.         cmp al,0
  583.         je @@reuseoffset
  584.           mov [edi].chOffset,al
  585.       @@reuseoffset:
  586.         movzx eax,[edi].chOffset
  587.         shl eax,8
  588.     @@nooffset:
  589. endif
  590.  
  591.       mov [edi].chGUSNextPos,eax
  592.       mov [edi].chVibPos,0
  593.       mov [edi].chTremPos,0
  594.       mov [edi].chArpPos,0
  595.       mov [edi].chMRetrigPos,0
  596.       mov [edi].chTremorPos,0
  597.       jmp @@nonote
  598.  
  599.   @@portanote:
  600.       shl eax,8
  601.       add ax,[edi].chCurNormNote
  602.       neg ax
  603.       add ah,48
  604.       movsx eax,ax
  605. if USEBOTHFREQ
  606.       test byte ptr [ebp].head.hdOptions,1
  607.       jnz @@noamiga2
  608. endif
  609. if USEAMIGAFREQ
  610.         neg eax
  611.         call getfreq6848
  612.     @@noamiga2:
  613. endif
  614.       mov [edi].chPortaToPitch,eax
  615. @@nonote:
  616.  
  617.   cmp [edi].chSustain,0
  618.   je @@done
  619.   cmp [ebp].procins,0
  620.   je @@done
  621.     cmp [ebp].notedelayed,1
  622.     je @@noinsvolpan
  623.       mov al,[edi].chDefVol
  624.       mov [edi].chVol,al
  625.       mov [edi].chFinalVol,al
  626.       test byte ptr [ebp].head.hdOptions,2
  627.       jnz @@noinsvolpan
  628.       mov al,[edi].chDefPan
  629.       mov [edi].chPan,al
  630.       mov [edi].chFinalPan,al
  631.   @@noinsvolpan:
  632.     xor eax,eax
  633.     mov [edi].chFadeVol,8000h
  634.     mov [edi].chAVibPos,al
  635.     mov [edi].chAVibSwpPos,al
  636.     mov [edi].chVolEnvPos,eax
  637.     mov [edi].chVolEnvSegPos,ax
  638.     mov [edi].chPanEnvPos,eax
  639.     mov [edi].chPanEnvSegPos,ax
  640.  
  641. @@done:
  642.   ret
  643. endp
  644.  
  645. public xmpSetVolume_
  646. xmpSetVolume_ proc
  647.   push ebp
  648.   call loadebp
  649.   mov [ebp].uservol,al
  650.   pop ebp
  651.   ret
  652. endp
  653.  
  654. public xmpGetSync_
  655. xmpGetSync_ proc
  656.   push ebp
  657.   call loadebp
  658.   mov al,[ebp].syncval
  659.   pop ebp
  660.   ret
  661. endp
  662.  
  663. public xmpGetPos_
  664. xmpGetPos_ proc
  665.   push ebp
  666.   call loadebp
  667.   mov al,byte ptr [ebp].currow
  668.   mov ah,byte ptr [ebp].curord
  669.   pop ebp
  670.   ret
  671. endp
  672.  
  673.  
  674.  
  675.  
  676. freqrange proc
  677.   cmp eax,[ebp].head.hdPitchMin
  678.   jg @@lowlimok
  679.     mov eax,[ebp].head.hdPitchMin
  680. @@lowlimok:
  681.   cmp eax,[ebp].head.hdPitchMax
  682.   jl @@highlimok
  683.     mov eax,[ebp].head.hdPitchMax
  684.   jmp @@highlimok
  685. @@highlimok:
  686.   ret
  687. endp
  688.  
  689.  
  690. ;//***************************************************************************
  691. ;//effects
  692.  
  693. procnothing proc
  694.   ret
  695. endp
  696.  
  697. if USEJUMP
  698. procjump proc
  699.   movzx eax,[ebp].procdat
  700.   mov [ebp].jumptoord,eax
  701.   mov [ebp].jumptorow,0
  702.   ret
  703. endp
  704. else
  705.   procjump=procnothing
  706. endif
  707.  
  708. if USEBREAK
  709. procbreak proc
  710.   cmp [ebp].jumptoord,-1
  711.   jne @@onlyrow
  712.     mov eax,[ebp].curord
  713.     inc eax
  714.     mov [ebp].jumptoord,eax
  715. @@onlyrow:
  716.   movzx eax,[ebp].procdat
  717.   mov ebx,eax
  718.   shr al,4
  719.   imul eax,10
  720.   and bl,0fh
  721.   add eax,ebx
  722.   mov [ebp].jumptorow,eax
  723.   ret
  724. endp
  725. else
  726.   procbreak=procnothing
  727. endif
  728.  
  729. if USEPATLOOP
  730. procpatloop proc
  731.   mov al,[ebp].procdat
  732.   cmp al,0
  733.   je @@set
  734.     inc [edi].chPatLoopCount
  735.     cmp [edi].chPatLoopCount,al
  736.     ja @@nextrow
  737.       movzx eax,[edi].chPatLoopStart
  738.       mov [ebp].jumptorow,eax
  739.       mov eax,[ebp].curord
  740.       mov [ebp].jumptoord,eax
  741.     jmp @@done
  742.   @@nextrow:
  743.       mov [edi].chPatLoopCount,0
  744.       mov al,byte ptr [ebp].currow
  745.       inc al
  746.       mov [edi].chPatLoopStart,al
  747.     jmp @@done
  748. @@set:
  749.   mov al,byte ptr [ebp].currow
  750.   mov [edi].chPatLoopStart,al
  751. @@done:
  752.   ret
  753. endp
  754. else
  755.   procpatloop=procnothing
  756. endif
  757.  
  758. if USEPATDELAY
  759. procpatdelay proc
  760.   mov al,[ebp].procdat
  761.   mov [ebp].patdelay,al
  762.   ret
  763. endp
  764. else
  765.   procpatdelay=procnothing
  766. endif
  767.  
  768. if USESPEED
  769. proctempo proc
  770.   movzx ebx,[ebp].procdat
  771.   cmp bl,20h
  772.   jb @@speed
  773.     mov eax,2983615
  774.     xor edx,edx
  775.     div ebx
  776.     mov [ebp].stimerlen,eax
  777.     ret
  778. @@speed:
  779.     cmp bl,0
  780.     je @@ignore
  781.     mov [ebp].curtempo,bl
  782. @@ignore:
  783.   ret
  784. endp
  785. else
  786.   proctempo=procnothing
  787. endif
  788.  
  789. if USEVOL
  790. procnvol proc
  791.   mov al,[ebp].procdat
  792.   cmp al,40h
  793.   jbe @@vok
  794.     mov al,40h
  795. @@vok:
  796.   mov [edi].chVol,al
  797.   mov [edi].chFinalVol,al
  798.   ret
  799. endp
  800. else
  801.   procnvol=procnothing
  802. endif
  803.  
  804. if USEGVOL
  805. procgvol proc
  806.   mov al,[ebp].procdat
  807.   cmp al,40h
  808.   jbe @@vok
  809.     mov al,40h
  810. @@vok:
  811.   mov [ebp].globalvol,al
  812.   ret
  813. endp
  814. else
  815.   procgvol=procnothing
  816. endif
  817.  
  818. if USEPAN
  819. procpan proc
  820.   mov al,[ebp].procdat
  821.   mov [edi].chPan,al
  822.   mov [edi].chFinalPan,al
  823.   ret
  824. endp
  825. else
  826.   procpan=procnothing
  827. endif
  828.  
  829. if USESPAN
  830. procspan proc
  831.   mov al,[ebp].procdat
  832.   shl al,4
  833.   or al,[ebp].procdat
  834.   mov [edi].chPan,al
  835.   mov [edi].chFinalPan,al
  836.   ret
  837. endp
  838. else
  839.   procspan=procnothing
  840. endif
  841.  
  842. if USEVPAN
  843. procvpan proc
  844.   mov al,[ebp].procvol
  845.   shl al,4
  846.   or al,[ebp].procvol
  847.   mov [edi].chPan,al
  848.   mov [edi].chFinalPan,al
  849.   ret
  850. endp
  851. else
  852.   procvpan=procnothing
  853. endif
  854.  
  855. if USEARPEGGIO
  856. procarpeggio proc
  857.   movzx eax,[ebp].procdat
  858.   cmp al,0
  859.   jne @@doit
  860.     mov [edi].chCommand,0ffh
  861. @@doit:
  862.   shl eax,4
  863.   shr al,4
  864.   mov [edi].chArpNotes[0],0
  865.   mov [edi].chArpNotes[1],ah
  866.   mov [edi].chArpNotes[2],al
  867.   ret
  868. endp
  869.  
  870. doarpeggio proc
  871.   movzx eax,[edi].chArpPos
  872.   mov al,[edi].chArpNotes[eax]
  873. if USEBOTHFREQ
  874.   test byte ptr [ebp].head.hdOptions,1
  875.   jz @@amiga
  876. endif
  877. if USELINEARFREQ
  878.     shl eax,8
  879.     neg eax
  880.     add eax,[edi].chFinalPitch
  881.     call freqrange
  882.     mov [edi].chFinalPitch,eax
  883. endif
  884. if USEBOTHFREQ
  885.   jmp @@noamiga
  886. endif
  887. if USEAMIGAFREQ
  888. @@amiga:
  889.     call @@getadr
  890.   @@getadr:
  891.     pop edx
  892.     mov ax,[edx+logfreqtab[16*4+eax*2]-@@getadr]
  893.     mul [edi].chFinalPitch
  894.     shrd eax,edx,15
  895.     call freqrange
  896.     mov [edi].chFinalPitch,eax
  897. endif
  898.  
  899. @@noamiga:
  900.   inc [edi].chArpPos
  901.   cmp [edi].chArpPos,3
  902.   jne @@done
  903.     mov [edi].chArpPos,0
  904. @@done:
  905.   ret
  906. endp
  907. else
  908.   procarpeggio=procnothing
  909.   doarpeggio=procnothing
  910. endif
  911.  
  912.  
  913.  
  914. if USETREMTYPE and USETREMOLO
  915. proctremtype proc
  916.   mov al,[ebp].procdat
  917.   and al,3
  918.   mov [edi].chTremType,al
  919.   ret
  920. endp
  921. else
  922.   proctremtype=procnothing
  923. endif
  924.  
  925. if USETREMOLO
  926. proctremolo proc
  927.   mov al,[ebp].procdat
  928.   and al,0Fh
  929.   jz @@reusel
  930.     shl al,2
  931.     mov [edi].chTremDep,al
  932. @@reusel:
  933.   mov al,[ebp].procdat
  934.   and al,0F0h
  935.   jz @@reuseh
  936.     shr al,2
  937.     mov [edi].chTremRate,al
  938. @@reuseh:
  939.   ret
  940. endp
  941.  
  942. dotremolo proc
  943.   movzx eax,word ptr [edi].chTremPos
  944.   movsx eax,[ebp].vibtabs[eax]
  945.   imul [edi].chTremDep
  946.   sar eax,6
  947.   add al,[edi].chFinalVol
  948.   jns @@lok
  949.     mov al,0
  950. @@lok:
  951.   cmp al,40h
  952.   jbe @@tok
  953.     mov al,40h
  954. @@tok:
  955.   mov [edi].chFinalVol,al
  956.  
  957.   cmp [ebp].tick0,0
  958.   jne @@done
  959.   mov al,[edi].chTremRate
  960.   add [edi].chTremPos,al
  961. @@done:
  962.   ret
  963. endp
  964. else
  965.   proctremolo=procnothing
  966.   dotremolo=procnothing
  967. endif
  968.  
  969.  
  970.  
  971.  
  972.  
  973. if USEFPORTA
  974. procfportau proc
  975.   mov al,[ebp].procdat
  976.   cmp al,0
  977.   je @@reuse
  978.     mov [edi].chFinePortaUVal,al
  979. @@reuse:
  980.   movzx eax,[edi].chFinePortaUVal
  981.   shl eax,4
  982.   neg eax
  983.   add eax,[edi].chPitch
  984.   call freqrange
  985.   mov [edi].chPitch,eax
  986.   mov [edi].chFinalPitch,eax
  987.   ret
  988. endp
  989.  
  990. procfportad proc
  991.   mov al,[ebp].procdat
  992.   cmp al,0
  993.   je @@reuse
  994.     mov [edi].chFinePortaDVal,al
  995. @@reuse:
  996.   movzx eax,[edi].chFinePortaDVal
  997.   shl eax,4
  998.   add eax,[edi].chPitch
  999.   call freqrange
  1000.   mov [edi].chPitch,eax
  1001.   mov [edi].chFinalPitch,eax
  1002.   ret
  1003. endp
  1004. else
  1005.   procfportau=procnothing
  1006.   procfportad=procnothing
  1007. endif
  1008.  
  1009.  
  1010. if USEXFPORTA
  1011. procxfporta proc
  1012.   movzx eax,[ebp].procdat
  1013.   shl eax,4
  1014.   shr al,4
  1015.   cmp ah,2
  1016.   je @@down
  1017.   cmp ah,1
  1018.   jne @@done
  1019.  
  1020.     cmp al,0
  1021.     je @@reuseu
  1022.       mov [edi].chXFinePortaUVal,al
  1023.   @@reuseu:
  1024.     movzx eax,[edi].chXFinePortaUVal
  1025.     shl eax,2
  1026.     neg eax
  1027.     add eax,[edi].chPitch
  1028.     call freqrange
  1029.     mov [edi].chPitch,eax
  1030.     mov [edi].chFinalPitch,eax
  1031.   jmp @@done
  1032.  
  1033. @@down:
  1034.     cmp al,0
  1035.     je @@reused
  1036.       mov [edi].chXFinePortaDVal,al
  1037.   @@reused:
  1038.     movzx eax,[edi].chXFinePortaDVal
  1039.     shl eax,2
  1040.     add eax,[edi].chPitch
  1041.     call freqrange
  1042.     mov [edi].chPitch,eax
  1043.     mov [edi].chFinalPitch,eax
  1044.  
  1045. @@done:
  1046.   ret
  1047. endp
  1048. else
  1049.   procxfporta=procnothing
  1050. endif
  1051.  
  1052.  
  1053. if USEFVOLSLIDE
  1054. procfvolup proc
  1055.   mov al,[ebp].procdat
  1056.   cmp al,0
  1057.   je @@reuse
  1058.     mov [edi].chFineVolSlideUVal,al
  1059. @@reuse:
  1060.   mov al,[edi].chVol
  1061.   add al,[edi].chFineVolSlideUVal
  1062.   cmp al,40h
  1063.   jbe @@vok
  1064.     mov al,40h
  1065. @@vok:
  1066.   mov [edi].chVol,al
  1067.   mov [edi].chFinalVol,al
  1068.   ret
  1069. endp
  1070.  
  1071. procfvoldn proc
  1072.   mov al,[ebp].procdat
  1073.   cmp al,0
  1074.   je @@reuse
  1075.     mov [edi].chFineVolSlideDVal,al
  1076. @@reuse:
  1077.   mov al,[edi].chVol
  1078.   sub al,[edi].chFineVolSlideDVal
  1079.   jnc @@vok
  1080.     mov al,0
  1081. @@vok:
  1082.   mov [edi].chVol,al
  1083.   mov [edi].chFinalVol,al
  1084.   ret
  1085. endp
  1086. else
  1087.   procfvolup=procnothing
  1088.   procfvoldn=procnothing
  1089. endif
  1090.  
  1091. if USEVVOL
  1092. procvvol proc
  1093. procvvol4:
  1094.   mov [ebp].procvol,10h
  1095. procvvol3:
  1096.   add [ebp].procvol,10h
  1097. procvvol2:
  1098.   add [ebp].procvol,10h
  1099. procvvol1:
  1100.   add [ebp].procvol,10h
  1101. procvvol0:
  1102.   mov al,[ebp].procvol
  1103.   mov [edi].chVol,al
  1104.   mov [edi].chFinalVol,al
  1105.   ret
  1106. endp
  1107. else
  1108.   procvvol0=procnothing
  1109.   procvvol1=procnothing
  1110.   procvvol2=procnothing
  1111.   procvvol3=procnothing
  1112.   procvvol4=procnothing
  1113. endif
  1114.  
  1115. if USEVPANSLIDE or USEVVOLSLIDE
  1116. procvvpsl proc
  1117.   mov al,[ebp].procvol
  1118.   mov [edi].chVVolPanSlideVal,al
  1119.   ret
  1120. endp
  1121. else
  1122.   procvvpsl=procnothing
  1123. endif
  1124.  
  1125. if USEVVOLSLIDE
  1126. dovvolsld proc
  1127.   mov al,[edi].chVol
  1128.   cmp [ebp].tick0,0
  1129.   jne @@done
  1130.   sub al,[edi].chVVolPanSlideVal
  1131.   jnc @@done
  1132.     mov al,0
  1133. @@done:
  1134.   mov [edi].chVol,al
  1135.   mov [edi].chFinalVol,al
  1136.   ret
  1137. endp
  1138.  
  1139. dovvolslu proc
  1140.   mov al,[edi].chVol
  1141.   cmp [ebp].tick0,0
  1142.   jne @@done
  1143.   add al,[edi].chVVolPanSlideVal
  1144.   cmp al,40h
  1145.   jbe @@done
  1146.     mov al,40h
  1147. @@done:
  1148.   mov [edi].chVol,al
  1149.   mov [edi].chFinalVol,al
  1150.   ret
  1151. endp
  1152. else
  1153.   dovvolsld=procnothing
  1154.   dovvolslu=procnothing
  1155. endif
  1156.  
  1157. if USEVPANSLIDE
  1158. dovpansll proc
  1159.   mov al,[edi].chPan
  1160.   cmp [ebp].tick0,0
  1161.   jne @@done
  1162.   sub al,[edi].chVVolPanSlideVal
  1163.   jnc @@done
  1164.     mov al,0
  1165. @@done:
  1166.   mov [edi].chPan,al
  1167.   mov [edi].chFinalPan,al
  1168.   ret
  1169. endp
  1170.  
  1171. dovpanslr proc
  1172.   mov al,[edi].chVol
  1173.   cmp [ebp].tick0,0
  1174.   jne @@done
  1175.   add al,[edi].chVVolPanSlideVal
  1176.   jnc @@done
  1177.     mov al,0ffh
  1178. @@done:
  1179.   mov [edi].chPan,al
  1180.   mov [edi].chFinalPan,al
  1181.   ret
  1182. endp
  1183. else
  1184.   dovpansll=procnothing
  1185.   dovpanslr=procnothing
  1186. endif
  1187.  
  1188. if USEVFVOLSLIDE
  1189. procvfvolup proc
  1190.   mov al,[edi].chVol
  1191.   add al,[ebp].procvol
  1192.   cmp al,40h
  1193.   jbe @@vok
  1194.     mov al,40h
  1195. @@vok:
  1196.   mov [edi].chVol,al
  1197.   mov [edi].chFinalVol,al
  1198.   ret
  1199. endp
  1200.  
  1201. procvfvoldn proc
  1202.   mov al,[edi].chVol
  1203.   sub al,[ebp].procvol
  1204.   jnc @@vok
  1205.     mov al,0
  1206. @@vok:
  1207.   mov [edi].chVol,al
  1208.   mov [edi].chFinalVol,al
  1209.   ret
  1210. endp
  1211. else
  1212.   procvfvolup=procnothing
  1213.   procvfvoldn=procnothing
  1214. endif
  1215.  
  1216. if USESYNC
  1217. procsync proc
  1218.   mov al,[ebp].procdat
  1219.   mov [ebp].syncval,al
  1220.   ret
  1221. endp
  1222. else
  1223.   procsync=procnothing
  1224. endif
  1225.  
  1226.  
  1227. if USETREMOR
  1228. proctremor proc
  1229.   movzx eax,[ebp].procdat
  1230.   cmp al,0
  1231.   je @@reuse
  1232.     shl eax,4
  1233.     shr al,4
  1234.     inc al
  1235.     inc ah
  1236.     add al,ah
  1237.     mov [edi].chTremorLen,al
  1238.     mov [edi].chTremorOff,ah
  1239.     mov [edi].chTremorPos,0
  1240. @@reuse:
  1241.   ret
  1242. endp
  1243.  
  1244. dotremor proc
  1245.   mov al,[edi].chTremorPos
  1246.   cmp al,[edi].chTremorOff
  1247.   jb @@on
  1248.     mov [edi].chFinalVol,0
  1249. @@on:
  1250.   cmp [ebp].tick0,0
  1251.   jne @@done
  1252.   mov al,[edi].chTremorPos
  1253.   inc al
  1254.   cmp al,[edi].chTremorLen
  1255.   jb @@noloop
  1256.     xor al,al
  1257. @@noloop:
  1258.   mov [edi].chTremorPos,al
  1259. @@done:
  1260.   ret
  1261. endp
  1262. else
  1263.   proctremor=procnothing
  1264.   dotremor=procnothing
  1265. endif
  1266.  
  1267.  
  1268.  
  1269. if USEENVPOS
  1270. procenvpos proc
  1271.   cmp [edi].chEnvIns,0
  1272.   je @@noenvins
  1273.   mov ebx,[edi].chEnvIns
  1274.  
  1275.   xor eax,eax
  1276.   movzx edx,[ebp].procdat
  1277.   jmp @@venvloops
  1278. @@venvloop:
  1279.     sub dx,[ebx].insVEnv[4*eax]
  1280.     jb @@venvok
  1281.     inc eax
  1282. @@venvloops:
  1283.   cmp al,[ebx].insVNum
  1284.   jne @@venvloop
  1285.   xor edx,edx
  1286.   sub dx,[ebx].insVEnv[4*eax]
  1287. @@venvok:
  1288.   add dx,[ebx].insVEnv[4*eax]
  1289.   mov [edi].chVolEnvPos,eax
  1290.   mov [edi].chVolEnvSegPos,dx
  1291.  
  1292.   xor eax,eax
  1293.   movzx edx,[ebp].procdat
  1294.   jmp @@penvloops
  1295. @@penvloop:
  1296.     sub dx,[ebx].insPEnv[4*eax]
  1297.     jb @@penvok
  1298.     inc eax
  1299. @@penvloops:
  1300.   cmp al,[ebx].insPNum
  1301.   jne @@venvloop
  1302.   xor edx,edx
  1303.   sub dx,[ebx].insPEnv[4*eax]
  1304. @@penvok:
  1305.   add dx,[ebx].insPEnv[4*eax]
  1306.   mov [edi].chPanEnvPos,eax
  1307.   mov [edi].chPanEnvSegPos,dx
  1308.  
  1309. @@noenvins:
  1310.   ret
  1311. endp
  1312. else
  1313.   procenvpos=procnothing
  1314. endif
  1315.  
  1316.  
  1317.  
  1318.  
  1319. if USEPORTA
  1320. procportau proc
  1321.   movzx eax,[ebp].procdat
  1322.   cmp al,0
  1323.   je @@reuse
  1324.     shl eax,4
  1325.     mov [edi].chPortaUVal,eax
  1326. @@reuse:
  1327.   ret
  1328. endp
  1329.  
  1330. procportad proc
  1331.   movzx eax,[ebp].procdat
  1332.   cmp al,0
  1333.   je @@reuse
  1334.     shl eax,4
  1335.     mov [edi].chPortaDVal,eax
  1336. @@reuse:
  1337.   ret
  1338. endp
  1339.  
  1340. doportau proc
  1341.   cmp [ebp].tick0,0
  1342.   jne @@done
  1343.   mov eax,[edi].chPitch
  1344.   sub eax,[edi].chPortaUVal
  1345.   call freqrange
  1346.   mov [edi].chPitch,eax
  1347.   mov [edi].chFinalPitch,eax
  1348. @@done:
  1349.   ret
  1350. endp
  1351.  
  1352. doportad proc
  1353.   cmp [ebp].tick0,0
  1354.   jne @@done
  1355.   mov eax,[edi].chPitch
  1356.   add eax,[edi].chPortaDVal
  1357.   call freqrange
  1358.   mov [edi].chPitch,eax
  1359.   mov [edi].chFinalPitch,eax
  1360. @@done:
  1361.   ret
  1362. endp
  1363. else
  1364.   procportau=procnothing
  1365.   procportad=procnothing
  1366.   doportau=procnothing
  1367.   doportad=procnothing
  1368. endif
  1369.  
  1370. if USEPORTANOTE
  1371. procportanote proc
  1372.   movzx eax,[ebp].procdat
  1373.   cmp al,0
  1374.   je @@reuse
  1375.     shl eax,4
  1376.     mov [edi].chPortaToVal,eax
  1377. @@reuse:
  1378.   ret
  1379. endp
  1380. else
  1381.   procportanote=procnothing
  1382. endif
  1383.  
  1384. if USEVPORTANOTE
  1385. procvportanote proc
  1386.   movzx eax,[ebp].procvol
  1387.   cmp al,0
  1388.   je @@reuse
  1389.     shl eax,8
  1390.     mov [edi].chPortaToVal,eax
  1391. @@reuse:
  1392.   ret
  1393. endp
  1394. else
  1395.   procvportanote=procnothing
  1396. endif
  1397.  
  1398.  
  1399. if USEGLISSANDO and (USEPORTANOTE or USEVPORTANOTE)
  1400. procgliss proc
  1401.   mov al,[ebp].procdat
  1402.   mov [edi].chGlissando,al
  1403.   ret
  1404. endp
  1405. else
  1406.   procgliss=procnothing
  1407. endif
  1408.  
  1409. if USEPORTANOTE or USEVPORTANOTE
  1410. doportanote proc
  1411.   mov eax,[edi].chPitch
  1412.   cmp [ebp].tick0,0
  1413.   jne @@set
  1414.   cmp eax,[edi].chPortaToPitch
  1415.   je @@set
  1416.   jg @@down
  1417.     add eax,[edi].chPortaToVal
  1418.     cmp eax,[edi].chPortaToPitch
  1419.     jle @@set
  1420.     mov eax,[edi].chPortaToPitch
  1421.     jmp @@set
  1422. @@down:
  1423.     sub eax,[edi].chPortaToVal
  1424.     cmp eax,[edi].chPortaToPitch
  1425.     jge @@set
  1426.     mov eax,[edi].chPortaToPitch
  1427. @@set:
  1428.   mov [edi].chPitch,eax
  1429.  
  1430. if USEGLISSANDO
  1431.   cmp [edi].chGlissando,0
  1432.   je @@setfinpitch
  1433. if USEBOTHFREQ
  1434.     test byte ptr [ebp].head.hdOptions,1
  1435.     jz @@amiga
  1436. endif
  1437. if USELINEARFREQ
  1438.       movzx ebx,[edi].chCurNormNote
  1439.       add eax,ebx
  1440.       add eax,80h
  1441.       xor al,al
  1442.       sub eax,ebx
  1443. endif
  1444. if USEBOTHFREQ
  1445.       jmp @@setfinpitch
  1446. endif
  1447. if USEAMIGAFREQ
  1448.   @@amiga:
  1449.       mov edx,eax ;// search for closest note
  1450.       mov ebx,eax ;// how should i do it??
  1451.       push ecx
  1452.       mov ecx,-1
  1453.       mov eax,-48*256
  1454.     @@aloop:
  1455.         push eax
  1456.         add ax,[edi].chCurNormNote
  1457.         movsx eax,ax
  1458.         call getfreq6848
  1459.         sub eax,edx
  1460.         jae @@apos
  1461.           neg eax
  1462.       @@apos:
  1463.         cmp eax,ecx
  1464.         jae @@aold
  1465.           mov ecx,eax
  1466.           mov eax,[esp]
  1467.           add ax,[edi].chCurNormNote
  1468.           movsx eax,ax
  1469.           call getfreq6848
  1470.           mov ebx,eax
  1471.       @@aold:
  1472.         pop eax
  1473.       inc ah
  1474.       cmp ah,48
  1475.       jne @@aloop
  1476.       pop ecx
  1477.       mov eax,ebx
  1478. endif
  1479. endif
  1480.  
  1481. @@setfinpitch:
  1482.   mov [edi].chFinalPitch,eax
  1483. @@done:
  1484.   ret
  1485. endp
  1486. else
  1487.   doportanote=procnothing
  1488. endif
  1489.  
  1490.  
  1491. if USEVIBTYPE and (USEVIBRATO or USEVVIBRATO)
  1492. procvibtype proc
  1493.   mov al,[ebp].procdat
  1494.   and al,3
  1495.   mov [edi].chVibType,al
  1496.   ret
  1497. endp
  1498. else
  1499.   procvibtype=procnothing
  1500. endif
  1501.  
  1502. if USEVIBRATO
  1503. procvibrato proc
  1504.   mov al,[ebp].procdat
  1505.   and al,0Fh
  1506.   jz @@reusel
  1507.     shl al,2
  1508.     mov [edi].chVibDep,al
  1509. @@reusel:
  1510.   mov al,[ebp].procdat
  1511.   and al,0F0h
  1512.   jz @@reuseh
  1513.     shr al,2
  1514.     mov [edi].chVibRate,al
  1515. @@reuseh:
  1516.   ret
  1517. endp
  1518. else
  1519.   procvibrato=procnothing
  1520. endif
  1521.  
  1522. if USEVVIBRATE
  1523. procvvibrat proc
  1524.   mov al,[ebp].procvol
  1525.   shl al,2
  1526.   je @@reuse
  1527.     mov [edi].chVibRate,al
  1528. @@reuse:
  1529.   ret
  1530. endp
  1531. else
  1532.   procvvibrat=procnothing
  1533. endif
  1534.  
  1535. if USEVVIBRATO
  1536. procvvib proc
  1537.   mov al,[ebp].procvol
  1538.   shl al,2
  1539.   je @@reuse
  1540.     mov [edi].chVibDep,al
  1541. @@reuse:
  1542.   ret
  1543. endp
  1544. else
  1545.   procvvib=procnothing
  1546. endif
  1547.  
  1548. if USEVIBRATO or USEVVIBRATO
  1549. dovibrato proc
  1550.   movzx eax,word ptr [edi].chVibPos
  1551.   movsx eax,[ebp].vibtabs[eax]
  1552.   imul [edi].chVibDep
  1553.   sar eax,3
  1554.   add eax,[edi].chFinalPitch
  1555.   call freqrange
  1556.   mov [edi].chFinalPitch,eax
  1557.  
  1558.   cmp [ebp].tick0,0
  1559.   jne @@done
  1560.   mov al,[edi].chVibRate
  1561.   add [edi].chVibPos,al
  1562. @@done:
  1563.   ret
  1564. endp
  1565. else
  1566.   dovibrato=procnothing
  1567. endif
  1568.  
  1569. if USEVOLSLIDE or USEVIBRATOVOL or USEPORTAVOL
  1570. procvolsl proc
  1571.   mov al,[ebp].procdat
  1572.   cmp al,0
  1573.   je @@reuse
  1574.     mov [edi].chVolSlideVal,al
  1575. @@reuse:
  1576.   ret
  1577. endp
  1578.  
  1579. dovolsl proc
  1580.   mov bl,[edi].chVolSlideVal
  1581.   mov al,[edi].chVol
  1582.   cmp [ebp].tick0,0
  1583.   jne @@done
  1584.   test bl,0f0h
  1585.   jnz @@up
  1586.     sub al,bl
  1587.     jnc @@done
  1588.       mov al,0
  1589.     jmp @@done
  1590. @@up:
  1591.     shr bl,4
  1592.     add al,bl
  1593.     cmp al,40h
  1594.     jbe @@done
  1595.       mov al,40h
  1596. @@done:
  1597.   mov [edi].chVol,al
  1598.   mov [edi].chFinalVol,al
  1599.   ret
  1600. endp
  1601. else
  1602.   procvolsl=procnothing
  1603.   dovolsl=procnothing
  1604. endif
  1605.  
  1606.  
  1607. if USEVIBRATOVOL and USEVIBRATO
  1608. dovibvol proc
  1609.   call dovibrato
  1610.   jmp dovolsl
  1611. endp
  1612. else
  1613.   dovibvol=procnothing
  1614. endif
  1615.  
  1616. if USEPORTAVOL and USEPORTANOTE
  1617. doportavol proc
  1618.   call doportanote
  1619.   jmp dovolsl
  1620. endp
  1621. else
  1622.   doportavol=procnothing
  1623. endif
  1624.  
  1625. if USEGVOLSLIDE
  1626. procgvolsl proc
  1627.   mov al,[ebp].procdat
  1628.   cmp al,0
  1629.   je @@reuse
  1630.     mov [edi].chGVolSlideVal,al
  1631. @@reuse:
  1632.   ret
  1633. endp
  1634.  
  1635. dogvolsl proc
  1636.   mov bl,[edi].chGVolSlideVal
  1637.   mov al,[ebp].globalvol
  1638.   cmp [ebp].tick0,0
  1639.   jne @@done
  1640.   test bl,0f0h
  1641.   jnz @@up
  1642.     sub al,bl
  1643.     jnc @@done
  1644.       mov al,0
  1645.     jmp @@done
  1646. @@up:
  1647.     shr bl,4
  1648.     add al,bl
  1649.     cmp al,40h
  1650.     jbe @@done
  1651.       mov al,40h
  1652. @@done:
  1653.   mov [ebp].globalvol,al
  1654.   ret
  1655. endp
  1656. else
  1657.   procgvolsl=procnothing
  1658.   dogvolsl=procnothing
  1659. endif
  1660.  
  1661. if USEPANSLIDE
  1662. procpansl proc
  1663.   mov al,[ebp].procdat
  1664.   cmp al,0
  1665.   je @@reuse
  1666.     mov [edi].chPanSlideVal,al
  1667. @@reuse:
  1668.   ret
  1669. endp
  1670.  
  1671. dopansl proc
  1672.   mov bl,[edi].chPanSlideVal
  1673.   mov al,[edi].chPan
  1674.   cmp [ebp].tick0,0
  1675.   jne @@done
  1676.   test bl,0f0h
  1677.   jnz @@left
  1678.     add al,bl
  1679.     jnc @@done
  1680.       mov al,0ffh
  1681.     jmp @@done
  1682. @@left:
  1683.     shr bl,4
  1684.     sub al,bl
  1685.     jnc @@done
  1686.       mov al,0
  1687. @@done:
  1688.   mov [edi].chPan,al
  1689.   mov [edi].chFinalPan,al
  1690.   ret
  1691. endp
  1692. else
  1693.   procpansl=procnothing
  1694.   dopansl=procnothing
  1695. endif
  1696.  
  1697. if USEDELAY or USEKEYOFFCMD or USENOTECUT
  1698. proctick proc
  1699.   mov al,[ebp].procdat
  1700.   mov [edi].chActionTick,al
  1701.   ret
  1702. endp
  1703. else
  1704.   proctick=procnothing
  1705. endif
  1706.  
  1707. if USEDELAY
  1708. dodelay proc
  1709.   cmp [ebp].tick0,0
  1710.   jne @@done
  1711.   mov al,[ebp].curtick
  1712.   cmp al,[edi].chActionTick
  1713.   jne @@done
  1714.     mov [ebp].notedelayed,1
  1715.     mov al,[edi].chDelayNote
  1716.     mov [ebp].procnot,al
  1717.     mov al,[edi].chCurIns
  1718.     mov [ebp].procins,al
  1719.     mov [ebp].proccmd,0ffh
  1720.     mov [ebp].procvol,0
  1721.     call PlayNote
  1722. @@done:
  1723.   ret
  1724. endp
  1725. else
  1726.   dodelay=procnothing
  1727. endif
  1728.  
  1729. if USEKEYOFFCMD
  1730. dokeyoff proc
  1731.   cmp [ebp].tick0,0
  1732.   jne @@done
  1733.   mov al,[ebp].curtick
  1734.   cmp al,[edi].chActionTick
  1735.   jne @@done
  1736.     mov [edi].chSustain,0
  1737. @@done:
  1738.   ret
  1739. endp
  1740. else
  1741.   dokeyoff=procnothing
  1742. endif
  1743.  
  1744. if USENOTECUT
  1745. donotecut proc
  1746.   cmp [ebp].tick0,0
  1747.   jne @@done
  1748.   mov al,[ebp].curtick
  1749.   cmp al,[edi].chActionTick
  1750.   jne @@done
  1751.     mov [edi].chVol,0
  1752.     mov [edi].chFinalVol,0
  1753. @@done:
  1754.   ret
  1755. endp
  1756. else
  1757.   donotecut=procnothing
  1758. endif
  1759.  
  1760. if USERETRIG
  1761. doretrig proc
  1762.   cmp [edi].chActionTick,0
  1763.   je @@done
  1764.     movzx eax,[ebp].curtick
  1765.     div [edi].chActionTick
  1766.     cmp ah,0
  1767.     jne @@done
  1768.       mov [edi].chGUSNextPos,0
  1769. @@done:
  1770.   ret
  1771. endp
  1772. else
  1773.   doretrig=procnothing
  1774. endif
  1775.  
  1776. if USEMRETRIG
  1777. procmretrig proc
  1778.   movzx eax,[ebp].procdat
  1779.   cmp al,0
  1780.   je @@reuse
  1781.     shl eax,4
  1782.     shr al,4
  1783.     mov [edi].chMRetrigLen,al
  1784.     mov [edi].chMRetrigAct,ah
  1785.     mov [edi].chMRetrigPos,0
  1786. @@reuse:
  1787.   ret
  1788. endp
  1789.  
  1790. domretrig proc
  1791.   mov al,[edi].chMRetrigPos
  1792.   inc [edi].chMRetrigPos
  1793.   cmp al,[edi].chMRetrigLen
  1794.   jne @@done
  1795.     mov [edi].chMRetrigPos,0
  1796.     mov [edi].chGUSNextPos,0
  1797.  
  1798.     mov al,[edi].chVol
  1799.     mov bl,[edi].chMRetrigAct
  1800.     mov ah,128
  1801.     xchg bl,cl
  1802.     rol ah,cl
  1803.     xchg bl,cl
  1804.     test bl,7
  1805.     jz @@done
  1806.     test bl,8
  1807.     jnz @@up
  1808.     cmp bl,5
  1809.     ja @@nosub
  1810.       sub al,ah
  1811.   @@nosub:
  1812.     cmp bl,6
  1813.     jne @@not6
  1814.       mov ah,al
  1815.       shr al,2
  1816.       add al,ah
  1817.       shr al,1
  1818.   @@not6:
  1819.     cmp bl,7
  1820.     jne @@setvol
  1821.       shr al,1
  1822.     jmp @@setvol
  1823.  
  1824.   @@up:
  1825.     cmp bl,13
  1826.     ja @@noadd
  1827.       add al,ah
  1828.   @@noadd:
  1829.     cmp bl,14
  1830.     jne @@not14
  1831.       mov ah,al
  1832.       shr al,1
  1833.       add al,ah
  1834.   @@not14:
  1835.     cmp bl,15
  1836.     jne @@setvol
  1837.       shl al,1
  1838.       jns @@setvol
  1839.         dec al
  1840.  
  1841.   @@setvol:
  1842.     cmp al,0
  1843.     jge @@lok
  1844.       mov al,0
  1845.   @@lok:
  1846.     cmp al,40h
  1847.     jbe @@tok
  1848.       mov al,40h
  1849.   @@tok:
  1850.  
  1851.     mov [edi].chVol,al
  1852.     mov [edi].chFinalVol,al
  1853. @@done:
  1854.   ret
  1855. endp
  1856. else
  1857.   procmretrig=procnothing
  1858.   domretrig=procnothing
  1859. endif
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865. ;//***************************************************************************
  1866. ;//effects end
  1867.  
  1868. callproccmdtab proc
  1869.   call @@getadr
  1870. @@getadr:
  1871.   pop ebx
  1872.   mov eax,[ebx+proccmdtab[4*eax]-@@getadr]
  1873.   lea eax,[eax+ebx+procnothing-@@getadr]
  1874.   jmp eax
  1875. endp
  1876.  
  1877.  
  1878.  
  1879. PlayTick proc
  1880.   mov [ebp].tick0,0
  1881.   lea edi,[ebp].chandata
  1882.   xor ecx,ecx
  1883. @@resetvalloop:
  1884.     mov al,[edi].chVol
  1885.     mov [edi].chFinalVol,al
  1886.     mov al,[edi].chPan
  1887.     mov [edi].chFinalPan,al
  1888.     mov eax,[edi].chPitch
  1889.     mov [edi].chFinalPitch,eax
  1890.   add edi,channelsize
  1891.   inc ecx
  1892.   cmp ecx,[ebp].head.hdNChannels
  1893.   jne @@resetvalloop
  1894.  
  1895.   inc [ebp].curtick
  1896.   mov al,[ebp].curtick
  1897.   cmp al,[ebp].curtempo
  1898.   jne @@notnextrow
  1899.  
  1900.     mov [ebp].curtick,0
  1901.     cmp [ebp].patdelay,0
  1902.     jz @@nextrow
  1903.       dec [ebp].patdelay
  1904.       jmp @@notnextrow
  1905.   @@nextrow:
  1906.     mov [ebp].tick0,1
  1907.  
  1908.     inc [ebp].currow
  1909.     cmp [ebp].jumptoord,-1
  1910.     jne @@dojump
  1911.     mov eax,[ebp].currow
  1912.     cmp eax,[ebp].patlen
  1913.     jb @@donotjump
  1914.       mov eax,[ebp].curord
  1915.       inc eax
  1916.       mov [ebp].jumptoord,eax
  1917.       mov [ebp].jumptorow,0
  1918.   @@dojump:
  1919.  
  1920.       mov eax,[ebp].jumptoord
  1921.       cmp [ebp].curord,eax
  1922.       je @@noresetploop
  1923.         lea edi,[ebp].chandata
  1924.         xor ecx,ecx
  1925.       @@resetplloop:
  1926.           mov [edi].chPatLoopCount,0
  1927.           mov [edi].chPatLoopStart,0
  1928.           add edi,channelsize
  1929.         inc ecx
  1930.         cmp ecx,[ebp].head.hdNChannels
  1931.         jne @@resetplloop
  1932.     @@noresetploop:
  1933.  
  1934.       mov eax,[ebp].jumptoord
  1935.       cmp eax,[ebp].head.hdNOrders
  1936.       jb @@dontloop
  1937.         mov eax,[ebp].head.hdOrdLoopStart
  1938.     @@dontloop:
  1939.       mov [ebp].curord,eax
  1940.       mov eax,[ebp].jumptorow
  1941.       mov [ebp].currow,eax
  1942.       mov [ebp].jumptoord,-1
  1943.       mov eax,[ebp].curord
  1944.       movzx eax,[ebp].head.hdOrderTable[eax]
  1945.       mov esi,[ebp].head.hdPatternTable[4*eax]
  1946.       lodsd
  1947.       mov [ebp].patlen,eax
  1948.       cmp [ebp].jumptorow,0
  1949.       je @@rowfound
  1950.     @@rowfind:
  1951.       @@chanskip:
  1952.           lodsb
  1953.           cmp al,0
  1954.           je @@rowend
  1955.  
  1956.           test al,20h
  1957.           jz @@not20
  1958.             add esi,2
  1959.         @@not20:
  1960.           test al,40h
  1961.           jz @@not40
  1962.             inc esi
  1963.         @@not40:
  1964.           test al,80h
  1965.           jz @@chanskip
  1966.             add esi,2
  1967.           jmp @@chanskip
  1968.       @@rowend:
  1969.  
  1970.       dec [ebp].jumptorow
  1971.       jnz @@rowfind
  1972.     @@rowfound:
  1973.       mov [ebp].patptr,esi
  1974.   @@donotjump:
  1975.  
  1976.     mov esi,[ebp].patptr
  1977.     lea edi,[ebp].chandata
  1978.     xor ecx,ecx
  1979.   @@processrow:
  1980.       mov [ebp].procnot,0
  1981.       mov dword ptr [ebp].procins,0
  1982.       mov [edi].chCommand,0ffh
  1983.  
  1984.       mov al,[esi]
  1985.       cmp al,0
  1986.       je @@procnextchan
  1987.  
  1988.       and al,1fh
  1989.       cmp al,cl
  1990.       jne @@procnextchan
  1991.  
  1992.       lodsb
  1993.       mov ah,al
  1994.       test ah,20h
  1995.       jz @@nonot
  1996.         lodsb
  1997.         mov [ebp].procnot,al
  1998.         lodsb
  1999.         mov [ebp].procins,al
  2000.     @@nonot:
  2001.       test ah,40h
  2002.       jz @@novol
  2003.         lodsb
  2004.         mov [ebp].procvol,al
  2005.     @@novol:
  2006.       test ah,80h
  2007.       jz @@nocmd
  2008.         lodsb
  2009.         mov [ebp].proccmd,al
  2010.         lodsb
  2011.         mov [ebp].procdat,al
  2012.     @@nocmd:
  2013.     @@procnote:
  2014.       mov [ebp].notedelayed,0
  2015.       call PlayNote
  2016.  
  2017. if USEVOLCOL
  2018.       movzx eax,[ebp].procvol
  2019.       and [ebp].procvol,0fh
  2020.       shr eax,4
  2021.       mov [edi].chVCommand,al
  2022.       add eax,(procvoltab-proccmdtab)/4
  2023.       call callproccmdtab
  2024. endif
  2025.  
  2026.       movzx eax,[ebp].proccmd
  2027.       cmp al,52
  2028.       jae @@procnextchan
  2029.         mov [edi].chCommand,al
  2030.         call callproccmdtab
  2031.  
  2032.     @@procnextchan:
  2033.       add edi,channelsize
  2034.     inc ecx
  2035.     cmp ecx,[ebp].head.hdNChannels
  2036.     jne @@processrow
  2037.     inc esi
  2038.     mov [ebp].patptr,esi
  2039.  
  2040. @@notnextrow:
  2041.  
  2042.   lea edi,[ebp].chandata
  2043.   xor ecx,ecx
  2044. @@dotickloop:
  2045. if USEVOLCOL
  2046. ;//process volume column
  2047.     movzx eax,[edi].chVCommand
  2048.     add eax,(dovoltab-proccmdtab)/4
  2049.     call callproccmdtab
  2050. endif
  2051.  
  2052. ;//process command
  2053.     movzx eax,[edi].chCommand
  2054.     cmp al,52
  2055.     jae @@donocmd
  2056.       add eax,(docmdtab-proccmdtab)/4
  2057.       call callproccmdtab
  2058.   @@donocmd:
  2059.  
  2060.     mov ebx,[edi].chEnvIns
  2061.     cmp ebx,0
  2062.     je @@noenvins
  2063.  
  2064. ;//process fadeout
  2065.     movzx eax,[edi].chFinalVol
  2066.     mul [ebp].uservol
  2067.     shr eax,6
  2068.     mul [ebp].globalvol
  2069.     mul [edi].chFadeVol
  2070.     shr edx,4
  2071.     mov [edi].chFinalVol,dl
  2072.  
  2073.     cmp [edi].chSustain,0
  2074.     jne @@sustain
  2075.       mov ax,[ebx].insVolFade
  2076.       sub [edi].chFadeVol,ax
  2077.       jnb @@sustain
  2078.         mov [edi].chFadeVol,0
  2079.   @@sustain:
  2080.  
  2081. if USEVOLENV
  2082. ;//process volume envelope
  2083.     mov eax,[edi].chVolEnvPos
  2084.     cmp [edi].chVolEnvSegPos,0
  2085.     je @@vnoloop
  2086.     cmp al,[ebx].insVLoopE
  2087.     jne @@vnoloop
  2088.       mov al,[ebx].insVLoopS
  2089.       mov [edi].chVolEnvPos,eax
  2090.   @@vnoloop:
  2091.     lea esi,[ebx].insVEnv[4*eax]
  2092.     cmp al,[ebx].insVNum
  2093.     je @@venvlast
  2094.       mov ax,[esi][4][2]
  2095.       mov dx,[esi][0][2]
  2096.       sub eax,edx
  2097.       imul [edi].chVolEnvSegPos
  2098.       idiv word ptr [esi][0][0]
  2099.       add al,byte ptr [esi][0][2]
  2100.       mul [edi].chFinalVol
  2101.       shr eax,6
  2102.       mov [edi].chFinalVol,al
  2103.  
  2104.       mov ax,[edi].chVolEnvSegPos
  2105.       cmp ax,0
  2106.       jne @@vnosustain
  2107.       cmp [edi].chSustain,0
  2108.       je @@vnosustain
  2109.         mov edx,[edi].chVolEnvPos
  2110.         cmp dl,[ebx].insVSustain
  2111.         je @@venvnostep
  2112.     @@vnosustain:
  2113.       inc eax
  2114.       cmp ax,[esi][0][0]
  2115.       jb @@venvnostep
  2116.         xor eax,eax
  2117.         inc [edi].chVolEnvPos
  2118.     @@venvnostep:
  2119.       mov [edi].chVolEnvSegPos,ax
  2120.       jmp @@venvend
  2121.  
  2122.   @@venvlast:
  2123.       mov al,byte ptr [esi][0][2]
  2124.       mul [edi].chFinalVol
  2125.       shr eax,6
  2126.       mov [edi].chFinalVol,al
  2127.   @@venvend:
  2128. endif
  2129.  
  2130. if USEPANENV
  2131. ;//process panning envelope
  2132.     mov eax,[edi].chPanEnvPos
  2133.     cmp [edi].chPanEnvSegPos,0
  2134.     je @@pnoloop
  2135.     cmp al,[ebx].insPLoopE
  2136.     jne @@pnoloop
  2137.       mov al,[ebx].insPLoopS
  2138.       mov [edi].chPanEnvPos,eax
  2139.   @@pnoloop:
  2140.     lea esi,[ebx].insPEnv[4*eax]
  2141.     cmp al,[ebx].insPNum
  2142.     je @@penvlast
  2143.       mov ax,[esi][4][2]
  2144.       mov dx,[esi][0][2]
  2145.       sub eax,edx
  2146.       imul [edi].chPanEnvSegPos
  2147.       idiv byte ptr [esi][0][0]
  2148.       add al,byte ptr [esi][0][2]
  2149.       sub al,32
  2150.       movsx edx,[edi].chFinalPan
  2151.       xor dl,dh
  2152.       imul dl
  2153.       shr eax,5
  2154.       add [edi].chFinalPan,al
  2155.  
  2156.       mov ax,[edi].chPanEnvSegPos
  2157.       cmp ax,0
  2158.       jne @@pnosustain
  2159.       cmp [edi].chSustain,0
  2160.       je @@pnosustain
  2161.         mov edx,[edi].chPanEnvPos
  2162.         cmp dl,[ebx].insPSustain
  2163.         je @@penvnostep
  2164.     @@pnosustain:
  2165.       inc eax
  2166.       cmp ax,[esi][0][0]
  2167.       jb @@penvnostep
  2168.         xor eax,eax
  2169.         inc [edi].chPanEnvPos
  2170.     @@penvnostep:
  2171.       mov [edi].chPanEnvSegPos,ax
  2172.       jmp @@penvend
  2173.  
  2174.   @@penvlast:
  2175.       mov al,byte ptr [esi][0][2]
  2176.       sub al,32
  2177.       movsx edx,[edi].chFinalPan
  2178.       xor dl,dh
  2179.       imul dl
  2180.       shr eax,5
  2181.       add [edi].chFinalPan,al
  2182.   @@penvend:
  2183. endif
  2184.  
  2185. if USEAUTOVIBRATO
  2186. ;//process auto vibrato
  2187.     movzx eax,[edi].chAVibPos
  2188.     mov ah,[ebx].insVibType
  2189.     mov al,[ebp].vibtabs[eax]
  2190.     imul [ebx].insVibDepth
  2191.     shr eax,4
  2192.  
  2193.     mov dl,[edi].chAVibSwpPos
  2194.     cmp dl,[ebx].insVibSweep
  2195.     jae @@nosweep
  2196.       imul dl
  2197.       idiv [ebx].insVibSweep
  2198.       inc [edi].chAVibSwpPos
  2199.   @@nosweep:
  2200.  
  2201.     neg eax
  2202.     movsx eax,al
  2203.     add eax,[edi].chFinalPitch
  2204.     call freqrange
  2205.     mov [edi].chFinalPitch,eax
  2206.  
  2207.     mov al,[ebx].insVibRate
  2208.     add [edi].chAVibPos,al
  2209. endif
  2210.  
  2211.   @@noenvins:
  2212.  
  2213. ;//conv vals for gus
  2214.     movzx eax,[edi].chFinalVol
  2215.     shl eax,1
  2216.     mov ax,[ebp].guslinvol[2*eax]
  2217.     mov [edi].chGUSVol,ax
  2218.  
  2219.     mov al,[edi].chFinalPan
  2220.     shr al,4
  2221.     mov [edi].chGUSPan,al
  2222.  
  2223.     mov eax,[edi].chFinalPitch
  2224. if USEBOTHFREQ
  2225.     test byte ptr [ebp].head.hdOptions,1
  2226.     jz @@amiga
  2227. endif
  2228. if USELINEARFREQ
  2229.       call getfreq6848
  2230.       mul [ebp].guschannels
  2231.       mov ebx,494
  2232.       div ebx
  2233. endif
  2234. if USEBOTHFREQ
  2235.       jmp @@noamiga
  2236. endif
  2237. if USEAMIGAFREQ
  2238.   @@amiga:
  2239.       cmp eax,100
  2240.       jb @@noamiga
  2241.       mov ebx,eax
  2242.       mov eax,94929
  2243.       mul [ebp].guschannels
  2244.       div ebx
  2245.   @@noamiga:
  2246. endif
  2247.  
  2248.     and al,not 1
  2249.     mov [edi].chGUSFrq,ax
  2250.  
  2251.   add edi,channelsize
  2252.   inc ecx
  2253.   cmp ecx,[ebp].head.hdNChannels
  2254.   jne @@dotickloop
  2255.  
  2256.   ret
  2257. endp
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263. public xmpPlay_
  2264. xmpPlay_ proc
  2265.   push ebp
  2266.   call loadebp
  2267.  
  2268.   mov [ebp].jumptoord,eax
  2269.   mov [ebp].curord,eax
  2270.   xor eax,eax
  2271.   mov [ebp].currow,eax
  2272.  
  2273.   call gusOpen
  2274.  
  2275.   lea edi,[ebp].chandata
  2276.   mov ecx,channelsize*8
  2277.   xor eax,eax
  2278.   rep stosd
  2279.  
  2280.   lea edi,[ebp].chandata
  2281.   xor ecx,ecx
  2282. @@panloop:
  2283.     mov al,[ebp].head.hdPanPos[ecx]
  2284.     mov [edi].chPan,al
  2285.     add edi,channelsize
  2286.   inc ecx
  2287.   cmp cl,32
  2288.   jne @@panloop
  2289.  
  2290.   xor eax,eax
  2291.   mov [ebp].globalvol,40h
  2292.   mov [ebp].jumptorow,eax
  2293.   mov [ebp].syncval,al
  2294.  
  2295.   mov al,[ebp].head.hdIniTempo
  2296.   mov [ebp].curtempo,al
  2297.   dec al
  2298.   mov [ebp].curtick,al
  2299.  
  2300.   mov eax,2983615
  2301.   xor edx,edx
  2302.   movzx ebx,[ebp].head.hdIniBPM
  2303.   div ebx
  2304.   mov [ebp].stimerlen,eax
  2305.   call tmInit
  2306.   pop ebp
  2307.   ret
  2308. endp
  2309.  
  2310. public xmpStop_
  2311. xmpStop_ proc
  2312.   push ebp
  2313.   call loadebp
  2314.   call tmClose
  2315.   call gusClose
  2316.   pop ebp
  2317.   ret
  2318. endp
  2319.  
  2320.  
  2321.  
  2322. ;//*************************************************************************
  2323. ;// system timer
  2324.  
  2325.  
  2326.  
  2327. tmTimerHandler proc
  2328.   pushad
  2329.   push ds
  2330.   push es
  2331.   push fs
  2332.   push gs
  2333.  
  2334.   call loadebp
  2335.   mov esi,ebp
  2336.  
  2337.   cld
  2338.   mov ds,cs:[esi].datasegsel
  2339.   mov es,[esi].datasegsel
  2340.  
  2341.   mov eax,[esi].tmTimerRate
  2342.   add [esi].tmTicker,eax
  2343.  
  2344.   add [esi].tmIntCount,eax
  2345.   cmp byte ptr [esi].tmIntCount+2,0
  2346.   je @@noorgcall
  2347.     mov byte ptr [esi].tmIntCount+2,0
  2348.     pushfd
  2349.     call [esi].tmOldTimer
  2350. @@noorgcall:
  2351.  
  2352.   mov al,20h
  2353.   out 20h,al
  2354.  
  2355.   mov ebx,[esi].maxtimerrate
  2356.   mov ecx,[esi].stimerlen
  2357.   mov edx,[esi].stimerpos
  2358.  
  2359.   sub edx,ebx
  2360.   ja @@another
  2361.     mov edx,ecx
  2362. @@another:
  2363.  
  2364.   mov [esi].stimerpos,edx
  2365.  
  2366.   cmp edx,ebx
  2367.   jb @@intervalok
  2368.     mov edx,ebx
  2369. @@intervalok:
  2370.   mov [esi].tmTimerRate,edx
  2371.   mov al,34h
  2372.   out 43h,al
  2373.   mov al,dl
  2374.   out 40h,al
  2375.   mov al,dh
  2376.   out 40h,al
  2377.  
  2378.   cmp [esi].stimerpos,ecx
  2379.   jne @@notick
  2380.   cmp [esi].tmInRoutine,0
  2381.   jnz @@notick
  2382.     mov [esi].tmInRoutine,1
  2383.     mov dword ptr [esi].tmOldSSESP,esp
  2384.     mov word ptr [esi].tmOldSSESP+4,ss
  2385.     push ds
  2386.     pop ss
  2387.     lea esp,[esi].tmStack+1024
  2388.     sti
  2389.     call gusPlayTick
  2390.     call PlayTick
  2391.     cli
  2392.     lss esp,[ebp].tmOldSSESP
  2393.     mov ds:[ebp].tmInRoutine,0
  2394. @@notick:
  2395.  
  2396.   pop gs
  2397.   pop fs
  2398.   pop es
  2399.   pop ds
  2400.   popad
  2401.   iretd
  2402. endp
  2403.  
  2404.  
  2405.  
  2406.  
  2407. tmInit proc
  2408.   mov [ebp].datasegsel,ds
  2409.  
  2410.   xor eax,eax
  2411.   mov [ebp].stimerpos,eax
  2412.   mov [ebp].tmIntCount,eax
  2413.   mov [ebp].tmInRoutine,0
  2414.   mov [ebp].tmTimerRate,65536
  2415.   mov eax,-65536
  2416.   sub eax,[ebp].stimerlen
  2417.   mov [ebp].tmTicker,eax
  2418.  
  2419. if GETSETINTMODEMULTI
  2420. if GETSETINTMODE and 1
  2421.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDPMI
  2422.   je @@dpmi
  2423. endif
  2424. if GETSETINTMODE and 2
  2425.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDOS
  2426.   je @@dos
  2427. endif
  2428. if GETSETINTMODE and 4
  2429.   cmp [ebp].tmGetSetIntMode,MXMINTMODEEOS
  2430.   je @@eos
  2431. endif
  2432.   jmp @@setdone
  2433. endif
  2434.  
  2435. if GETSETINTMODE and 1
  2436. @@dpmi:
  2437.     mov ax,0204h
  2438.     mov bl,8
  2439.     int 31h
  2440.     mov dword ptr [ebp].tmOldTimer+0,edx
  2441.     mov word ptr [ebp].tmOldTimer+4,cx
  2442.     mov ax,0205h
  2443.     mov bl,8
  2444.     call @@getadrdpmi
  2445.   @@getadrdpmi:
  2446.     pop edx
  2447.     add edx,tmTimerHandler-@@getadrdpmi
  2448.     mov cx,cs
  2449.     int 31h
  2450. endif
  2451. if GETSETINTMODEMULTI
  2452.   jmp @@setdone
  2453. endif
  2454.  
  2455. if GETSETINTMODE and 2
  2456. @@dos:
  2457.     push es
  2458.     mov ax,3508h
  2459.     int 21h
  2460.     mov dword ptr [ebp].tmOldTimer+0,ebx
  2461.     mov word ptr [ebp].tmOldTimer+4,es
  2462.     pop es
  2463.     push ds
  2464.     mov ax,2508h
  2465.     push cs
  2466.     pop ds
  2467.     call @@getadrdos
  2468.   @@getadrdos:
  2469.     pop edx
  2470.     add edx,tmTimerHandler-@@getadrdos
  2471.     int 21h
  2472.     pop ds
  2473. endif
  2474. if GETSETINTMODEMULTI
  2475.   jmp @@setdone
  2476. endif
  2477.  
  2478. if GETSETINTMODE and 4
  2479. @@eos:
  2480.     mov ah,Get_Irq
  2481.     mov bx,0
  2482.     Int_EOS
  2483.     mov dword ptr [ebp].tmOldTimer+0,edx
  2484.     mov word ptr [ebp].tmOldTimer+4,cx
  2485.  
  2486.     mov ah,Set_Irq
  2487.     mov bx,0
  2488.     call @@getadreos
  2489.   @@getadreos:
  2490.     pop edx
  2491.     add edx,tmTimerHandler-@@getadreos
  2492.     mov cx,cs
  2493.     Int_EOS
  2494. endif
  2495. if GETSETINTMODEMULTI
  2496.   jmp @@setdone
  2497. endif
  2498.  
  2499. @@setdone:
  2500.  
  2501.   mov al,34h
  2502.   out 43h,al
  2503.   mov eax,[ebp].tmTimerRate
  2504.   out 40h,al
  2505.   mov al,ah
  2506.   out 40h,al
  2507.   ret
  2508. endp
  2509.  
  2510.  
  2511. tmClose proc
  2512. if GETSETINTMODEMULTI
  2513. if GETSETINTMODE and 1
  2514.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDPMI
  2515.   je @@dpmi
  2516. endif
  2517. if GETSETINTMODE and 2
  2518.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDOS
  2519.   je @@dos
  2520. endif
  2521. if GETSETINTMODE and 4
  2522.   cmp [ebp].tmGetSetIntMode,MXMINTMODEEOS
  2523.   je @@eos
  2524. endif
  2525.   jmp @@resetdone
  2526. endif
  2527.  
  2528. if GETSETINTMODE and 1
  2529. @@dpmi:
  2530.     mov ax,0205h
  2531.     mov bl,8
  2532.     mov edx,dword ptr [ebp].tmOldTimer
  2533.     mov cx,word ptr [ebp].tmOldTimer+4
  2534.     int 31h
  2535. if GETSETINTMODEMULTI
  2536.   jmp @@resetdone
  2537. endif
  2538. endif
  2539.  
  2540. if GETSETINTMODE and 2
  2541. @@dos:
  2542.     push ds
  2543.     mov ax,2508h
  2544.     lds edx,[ebp].tmOldTimer
  2545.     int 21h
  2546.     pop ds
  2547. if GETSETINTMODEMULTI
  2548.   jmp @@resetdone
  2549. endif
  2550. endif
  2551.  
  2552. if GETSETINTMODE and 2
  2553. @@eos:
  2554.     mov ah,Set_Irq
  2555.     mov bx,0
  2556.     mov edx,dword ptr [ebp].tmOldTimer+0
  2557.     mov cx,word ptr [ebp].tmOldTimer+4
  2558.     Int_EOS
  2559. if GETSETINTMODEMULTI
  2560.   jmp @@resetdone
  2561. endif
  2562. endif
  2563.  
  2564. @@resetdone:
  2565.  
  2566.   mov al,34h
  2567.   out 43h,al
  2568.   xor al,al
  2569.   out 40h,al
  2570.   out 40h,al
  2571.   ret
  2572. endp
  2573.  
  2574. public xmpGetTimer_
  2575. xmpGetTimer_ proc
  2576.   pushf
  2577.   xor eax,eax
  2578.   cli
  2579.   out 43h,al
  2580.   in al,40h
  2581.   mov ah,al
  2582.   in al,40h
  2583.   popf
  2584.   xchg ah,al
  2585.   neg eax
  2586.   push ebp
  2587.   call loadebp
  2588.   add eax,[ebp].tmTimerRate
  2589.   add eax,[ebp].tmTicker
  2590.   pop ebp
  2591.   ret
  2592. endp
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598. ;//*************************************************************************
  2599. ;// GUS
  2600.  
  2601. gusoutp proc
  2602.   add edx,[ebp].gusport
  2603.   out dx,al
  2604.   sub edx,[ebp].gusport
  2605.   ret
  2606. endp
  2607.  
  2608. gusout proc
  2609.   push edx
  2610.   mov dx,103h
  2611.   xchg al,bl
  2612.   call gusoutp
  2613.   add dl,2
  2614.   xchg al,bl
  2615.   call gusoutp
  2616.   pop edx
  2617.   ret
  2618. endp
  2619.  
  2620. gusoutd proc
  2621.   push edx
  2622.   mov dx,103h
  2623.   xchg al,bl
  2624.   call gusoutp
  2625.   add dl,2
  2626.   xchg al,bl
  2627.   call gusoutp
  2628.   call gusdelay
  2629.   call gusoutp
  2630.   pop edx
  2631.   ret
  2632. endp
  2633.  
  2634. gusoutw proc
  2635.   push edx
  2636.   mov dx,103h
  2637.   xchg al,bl
  2638.   call gusoutp
  2639.   inc edx
  2640.   xchg al,bl
  2641.   add edx,[ebp].gusport
  2642.   out dx,ax
  2643.   pop edx
  2644.   ret
  2645. endp
  2646.  
  2647. gusin proc
  2648.   push edx
  2649.   mov dx,103h
  2650.   xchg al,bl
  2651.   call gusoutp
  2652.   add dl,2
  2653.   xchg al,bl
  2654.   add edx,[ebp].gusport
  2655.   in al,dx
  2656.   pop edx
  2657.   ret
  2658. endp
  2659.  
  2660. gusinw proc
  2661.   push edx
  2662.   mov dx,103h
  2663.   xchg al,bl
  2664.   call gusoutp
  2665.   inc edx
  2666.   xchg al,bl
  2667.   add edx,[ebp].gusport
  2668.   in ax,dx
  2669.   pop edx
  2670.   ret
  2671. endp
  2672.  
  2673. gusdelay proc
  2674.   push edx
  2675.   push eax
  2676.   mov dx,107h
  2677.   add edx,[ebp].gusport
  2678.   in al,dx
  2679.   in al,dx
  2680.   in al,dx
  2681.   in al,dx
  2682.   in al,dx
  2683.   in al,dx
  2684.   in al,dx
  2685.   pop eax
  2686.   pop edx
  2687.   ret
  2688. endp
  2689.  
  2690. gusselchn proc
  2691.   push edx
  2692.   mov dx,102h
  2693.   xchg al,cl
  2694.   call gusoutp
  2695.   xchg al,cl
  2696.   pop edx
  2697.   ret
  2698. endp
  2699.  
  2700.  
  2701. gussetpoint proc
  2702.   push eax
  2703.   shr eax,7
  2704.   and eax,1FFFh
  2705.   call gusoutw
  2706.   mov eax,[esp]
  2707.   inc bl
  2708.   shl eax,9
  2709.   call gusoutw
  2710.   dec bl
  2711.   pop eax
  2712.   ret
  2713. endp
  2714.  
  2715. gusopenchan proc
  2716.   cmp al,14
  2717.   jae @@chanok
  2718.     mov al,14
  2719. @@chanok:
  2720.   mov [ebp].guschannels,eax
  2721.  
  2722.   mov bl,04ch
  2723.   mov al,0
  2724.   call gusout
  2725.   call gusdelay
  2726.   call gusdelay
  2727.   inc al
  2728.   call gusout
  2729.   call gusdelay
  2730.   call gusdelay
  2731.  
  2732.   mov bl,0eh
  2733.   mov al,byte ptr [ebp].guschannels
  2734.   dec al
  2735.   or al,0c0h
  2736.   call gusout
  2737.  
  2738.   xor ecx,ecx
  2739. @@initloop:
  2740.     call gusselchn
  2741.     xor ax,ax
  2742.     mov bl,9
  2743.     call gusoutw
  2744.     mov al,3
  2745.     mov bl,0
  2746.     call gusoutd
  2747.     mov al,3
  2748.     mov bl,0dh
  2749.     call gusoutd
  2750.     mov al,3fh
  2751.     mov bl,6
  2752.     call gusout
  2753.     call gusdelay
  2754.   inc ecx
  2755.   cmp ecx,32
  2756.   jne @@initloop
  2757.  
  2758.   mov bl,4ch
  2759.   mov al,7
  2760.   call gusout
  2761.  
  2762.   mov cl,0
  2763.   call gusselchn
  2764.   xor edx,edx
  2765.   mov al,8
  2766.   call gusoutp
  2767.   ret
  2768. endp
  2769.  
  2770.  
  2771.  
  2772.  
  2773.  
  2774.  
  2775. gusfadevol proc
  2776.   mov bl,89h
  2777.   call gusinw
  2778.   movzx eax,ax
  2779.   mov bl,0
  2780.   cmp eax,edx
  2781.   jbe @@up
  2782.     xchg eax,edx
  2783.     mov bl,40h
  2784. @@up:
  2785.  
  2786.   sub edx,eax
  2787.   jz @@done
  2788.   cmp edx,4096
  2789.   jae @@normfade
  2790.     cmp bl,40h
  2791.     je @@swapped
  2792.       add eax,edx
  2793.   @@swapped:
  2794.     mov bl,9
  2795.     call gusoutw
  2796.     jmp @@done
  2797.  
  2798. @@normfade:
  2799.   add edx,eax
  2800.  
  2801.   cmp eax,4096
  2802.   jae @@stok
  2803.     mov eax,4096
  2804. @@stok:
  2805.   cmp edx,64512
  2806.   jbe @@eok
  2807.     mov edx,64512
  2808. @@eok:
  2809.  
  2810.   push ebx
  2811.   mov al,ah
  2812.   mov bl,7
  2813.   call gusout
  2814.   mov al,dh
  2815.   mov bl,8
  2816.   call gusout
  2817.   pop eax
  2818.   mov bl,0dh
  2819.   call gusoutd
  2820.  
  2821. @@done:
  2822.   ret
  2823. endp
  2824.  
  2825. gusfadevoldown proc
  2826.   push ebx
  2827.   push eax
  2828.   mov bl,07h
  2829.   mov al,04h
  2830.   call gusout
  2831.   mov bl,08h
  2832.   mov al,0fch
  2833.   call gusout
  2834.   mov bl,0dh
  2835.   mov al,40h
  2836.   call gusoutd
  2837.   pop eax
  2838.   pop ebx
  2839.   ret
  2840. endp
  2841.  
  2842.  
  2843. gusPlayTick proc
  2844.   cmp [ebp].gusport,0
  2845.   je @@nogus
  2846.  
  2847.   lea edi,[ebp].chandata
  2848.   xor ecx,ecx
  2849. @@clearloop:
  2850.     cmp [edi].chGUSInited,0
  2851.     je @@nostop
  2852.     cmp [edi].chGUSStopIt,0
  2853.     je @@nostop
  2854.       call gusselchn
  2855.       mov bl,0
  2856.       mov al,[edi].chGUSMode
  2857.       or al,3
  2858.       call gusoutd
  2859.       call gusfadevoldown
  2860.       mov [edi].chGUSStopIt,0
  2861.   @@nostop:
  2862.   add edi,channelsize
  2863.   inc ecx
  2864.   cmp ecx,[ebp].head.hdNChannels
  2865.   jne @@clearloop
  2866.  
  2867.   xor ecx,ecx
  2868. @@waitloop:
  2869.     call gusselchn
  2870.     mov bl,8dh
  2871.   @@dowait:
  2872.       call gusin
  2873.       test al,1
  2874.     jz @@dowait
  2875.   inc ecx
  2876.   cmp ecx,[ebp].head.hdNChannels
  2877.   jne @@waitloop
  2878.  
  2879.   lea edi,[ebp].chandata
  2880.   xor ecx,ecx
  2881. @@playloop:
  2882.     call gusselchn
  2883.     cmp [edi].chGUSInited,0
  2884.     je @@quiet
  2885.       cmp [edi].chGUSChangeSamp,0
  2886.       je @@samesample
  2887.         mov bl,2
  2888.         mov eax,[edi].chGUSLoopPos
  2889.         call gussetpoint
  2890.         mov bl,4
  2891.         mov eax,[edi].chGUSEndPos
  2892.         call gussetpoint
  2893.     @@samesample:
  2894.  
  2895.       cmp [edi].chGUSNextPos,-1
  2896.       je @@noposchange
  2897.         mov eax,[edi].chGUSNextPos
  2898.         add eax,[edi].chGUSStartPos
  2899.  
  2900.         cmp eax,[edi].chGUSEndPos
  2901.         jb @@posok
  2902.           mov eax,[edi].chGUSEndPos
  2903.           dec eax
  2904.       @@posok:
  2905.         mov bl,10
  2906.         call gussetpoint
  2907.         mov bl,80h
  2908.         call gusin
  2909.         mov bl,0
  2910.         and al,40h
  2911.         or al,[edi].chGUSMode
  2912.         call gusout
  2913.  
  2914.     @@noposchange:
  2915.       mov bl,80h
  2916.       call gusin
  2917.       test bl,1
  2918.       jnz @@quiet
  2919.         mov bl,0ch
  2920.         mov al,[edi].chGUSPan
  2921.         call gusout
  2922.         mov bl,1
  2923.         mov ax,[edi].chGUSFrq
  2924.         call gusoutw
  2925.         movzx edx,[edi].chGUSVol
  2926.         call gusfadevol
  2927.       jmp @@nextchan
  2928.  
  2929.   @@quiet:
  2930.       call gusfadevoldown
  2931.  
  2932.   @@nextchan:
  2933.     mov [edi].chGUSChangeSamp,0
  2934.     mov [edi].chGUSNextPos,-1
  2935.   add edi,channelsize
  2936.   inc ecx
  2937.   cmp ecx,[ebp].head.hdNChannels
  2938.   jne @@playloop
  2939.  
  2940. @@nogus:
  2941.   ret
  2942. endp
  2943.  
  2944.  
  2945. gusOpen proc
  2946.   cmp [ebp].gusport,0
  2947.   je @@nogus
  2948.   mov eax,[ebp].head.hdNChannels
  2949.   call gusopenchan
  2950.   mov cl,0
  2951.   call gusselchn
  2952.   xor edx,edx
  2953.   mov al,9
  2954.   call gusoutp
  2955. @@nogus:
  2956.   ret
  2957. endp
  2958.  
  2959. gusClose proc
  2960.   cmp [ebp].gusport,0
  2961.   je @@nogus
  2962.   mov eax,14
  2963.   call gusopenchan
  2964. @@nogus:
  2965.   ret
  2966. endp
  2967.  
  2968.  
  2969. gusUploadSamples proc
  2970.   cmp [ebp].gusport,0
  2971.   je @@done
  2972.   shr ecx,4
  2973.   jz @@done
  2974.   xor ebx,ebx
  2975.  
  2976. @@bigloop:
  2977.     pushf
  2978.     cli
  2979.     mov edx,[ebp].gusport
  2980.     add dx,103h
  2981.     mov al,44h
  2982.     out dx,al
  2983.     add dl,2
  2984.     mov eax,ebx
  2985.     shr eax,16
  2986.     out dx,al
  2987.     sub dl,2
  2988.     mov al,43h
  2989.     out dx,al
  2990.     inc dl
  2991.   @@loop:
  2992.       mov eax,ebx
  2993.       out dx,ax
  2994.       lodsb
  2995.       add dl,3
  2996.       out dx,al
  2997.       sub dl,3
  2998.       inc ebx
  2999.     test bl,0fh
  3000.     jnz @@loop
  3001.     popf
  3002.   dec ecx
  3003.   jnz @@bigloop
  3004. @@done:
  3005.   ret
  3006. endp
  3007.  
  3008. public xmpGetGUSPort_
  3009. xmpGetGUSPort_ proc
  3010.   xor eax,eax
  3011.   cmp edi,0
  3012.   je @@done
  3013.   xor ecx,ecx
  3014.   dec ecx
  3015.   jmp @@scanentry
  3016. @@envscan:
  3017.     repne scasb
  3018.   @@scanentry:
  3019.     cmp byte ptr ds:[edi],0
  3020.     je @@done
  3021.     cmp dword ptr ds:[edi],52544C55h
  3022.     jne @@envscan
  3023.     cmp dword ptr ds:[edi+4],444E5341h
  3024.     jne @@envscan
  3025.     cmp word ptr ds:[edi+8],323Dh
  3026.     jne @@envscan
  3027.     cmp word ptr ds:[edi+11],2C30h
  3028.     jne @@envscan
  3029.     mov al,byte ptr ds:[edi+10]
  3030.     sub al,30h
  3031.     shl al,4
  3032.     mov ah,2
  3033. @@done:
  3034.   ret
  3035. endp
  3036.  
  3037.  
  3038. if DPMIPSPCODE
  3039. public xmpGetEnvPtrDPMI_
  3040. xmpGetEnvPtrDPMI_ proc
  3041.   push ds
  3042.   mov ds,ax
  3043.   mov bx,ds:[2Ch]
  3044.   pop ds
  3045.   mov ax,6
  3046.   xor edx,edx
  3047.   int 31h
  3048.   jc @@done
  3049.   shl edx,16
  3050.   shrd edx,ecx,16
  3051. @@done:
  3052.   mov edi,edx
  3053.   ret
  3054. endp
  3055. endif
  3056.  
  3057. if DOS32CODE
  3058. public xmpGetEnvPtrDOS32_
  3059. xmpGetEnvPtrDOS32_ proc
  3060.   mov ax,0EE02h
  3061.   int 31h
  3062.   ret
  3063. endp
  3064. endif
  3065.  
  3066.  
  3067. sintab db 0,2,3,5,6,8,9,11,12,14,16,17,19,20,22,23,24,26,27,29,30,32,33
  3068.        db 34,36,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
  3069.        db 56,57,58,59,59,60,60,61,61,62,62,62,63,63,63,64,64,64,64,64
  3070. logfreqtab dw 32768,32761,32753,32746,32738,32731,32724,32716,32709,32702,32694,32687,32679,32672,32665,32657
  3071.            dw 32768,32650,32532,32415,32298,32182,32066,31950,31835,31720,31606,31492,31379,31266,31153,31041
  3072.            dw 32768,30929,29193,27554,26008,24548,23170,21870,20643,19484,18390,17358,16384,15464,14596,13777
  3073.            dd 11131415,4417505,1753088,695713,276094,109568,43482,17256,6848,2718,1078,428,170,67,27,11
  3074.  
  3075. proccmdtab label dword
  3076.   dd procarpeggio-procnothing
  3077.   dd procportau-procnothing
  3078.   dd procportad-procnothing
  3079.   dd procportanote-procnothing
  3080.   dd procvibrato-procnothing
  3081.   dd procvolsl-procnothing
  3082.   dd procvolsl-procnothing
  3083.   dd proctremolo-procnothing
  3084.   dd procpan-procnothing
  3085.   dd 0
  3086.   dd procvolsl-procnothing
  3087.   dd procjump-procnothing
  3088.   dd procnvol-procnothing
  3089.   dd procbreak-procnothing
  3090.   dd 0
  3091.   dd proctempo-procnothing
  3092.   dd procgvol-procnothing
  3093.   dd procgvolsl-procnothing
  3094.   dd 0
  3095.   dd 0
  3096.   dd proctick-procnothing
  3097.   dd procenvpos-procnothing
  3098.   dd 0
  3099.   dd 0
  3100.   dd 0
  3101.   dd procpansl-procnothing
  3102.   dd 0
  3103.   dd procmretrig-procnothing
  3104.   dd procsync-procnothing
  3105.   dd proctremor-procnothing
  3106.   dd 0
  3107.   dd 0
  3108.   dd 0
  3109.   dd procxfporta-procnothing
  3110.   dd 0
  3111.   dd 0
  3112.  
  3113.   dd 0
  3114.   dd procfportau-procnothing
  3115.   dd procfportad-procnothing
  3116.   dd procgliss-procnothing
  3117.   dd procvibtype-procnothing
  3118.   dd 0
  3119.   dd procpatloop-procnothing
  3120.   dd proctremtype-procnothing
  3121.   dd procspan-procnothing
  3122.   dd proctick-procnothing
  3123.   dd procfvolup-procnothing
  3124.   dd procfvoldn-procnothing
  3125.   dd proctick-procnothing
  3126.   dd proctick-procnothing
  3127.   dd procpatdelay-procnothing
  3128.   dd procsync-procnothing
  3129.  
  3130. docmdtab label dword
  3131.   dd doarpeggio-procnothing
  3132.   dd doportau-procnothing
  3133.   dd doportad-procnothing
  3134.   dd doportanote-procnothing
  3135.   dd dovibrato-procnothing
  3136.   dd doportavol-procnothing
  3137.   dd dovibvol-procnothing
  3138.   dd dotremolo-procnothing
  3139.   dd 0
  3140.   dd 0
  3141.   dd dovolsl-procnothing
  3142.   dd 0
  3143.   dd 0
  3144.   dd 0
  3145.   dd 0
  3146.   dd 0
  3147.   dd 0
  3148.   dd dogvolsl-procnothing
  3149.   dd 0
  3150.   dd 0
  3151.   dd dokeyoff-procnothing
  3152.   dd 0
  3153.   dd 0
  3154.   dd 0
  3155.   dd 0
  3156.   dd dopansl-procnothing
  3157.   dd 0
  3158.   dd domretrig-procnothing
  3159.   dd 0
  3160.   dd dotremor-procnothing
  3161.   dd 0
  3162.   dd 0
  3163.   dd 0
  3164.   dd 0
  3165.   dd 0
  3166.   dd 0
  3167.  
  3168.   dd 0
  3169.   dd 0
  3170.   dd 0
  3171.   dd 0
  3172.   dd 0
  3173.   dd 0
  3174.   dd 0
  3175.   dd 0
  3176.   dd 0
  3177.   dd doretrig-procnothing
  3178.   dd 0
  3179.   dd 0
  3180.   dd donotecut-procnothing
  3181.   dd dodelay-procnothing
  3182.   dd 0
  3183.   dd 0
  3184.  
  3185. if USEVOLCOL
  3186. procvoltab label dword
  3187.   dd 0
  3188.   dd procvvol0-procnothing
  3189.   dd procvvol1-procnothing
  3190.   dd procvvol2-procnothing
  3191.   dd procvvol3-procnothing
  3192.   dd procvvol4-procnothing
  3193.   dd procvvpsl-procnothing
  3194.   dd procvvpsl-procnothing
  3195.   dd procvfvoldn-procnothing
  3196.   dd procvfvolup-procnothing
  3197.   dd procvvibrat-procnothing
  3198.   dd procvvib-procnothing
  3199.   dd procvpan-procnothing
  3200.   dd procvvpsl-procnothing
  3201.   dd procvvpsl-procnothing
  3202.   dd procvportanote-procnothing
  3203.  
  3204. dovoltab label dword
  3205.   dd 0
  3206.   dd 0
  3207.   dd 0
  3208.   dd 0
  3209.   dd 0
  3210.   dd 0
  3211.   dd dovvolsld-procnothing
  3212.   dd dovvolslu-procnothing
  3213.   dd 0
  3214.   dd 0
  3215.   dd 0
  3216.   dd dovibrato-procnothing
  3217.   dd 0
  3218.   dd dovpansll-procnothing
  3219.   dd dovpanslr-procnothing
  3220.   dd doportanote-procnothing
  3221. endif
  3222.  
  3223. ends
  3224.  
  3225. end
  3226.